Странный код ломает сборку в MSVC. Что это значит? - PullRequest
4 голосов
/ 21 января 2011

Я пытаюсь включить rapidxml в мой текущий проект.Однако он не будет собираться.

Visual Studio будет жаловаться на этот фрагмент кода (rapidxml.hpp: 419 + 451):

419: void *memory = allocate_aligned(sizeof(xml_attribute<Ch>));
420: xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;

Компилятор скажет

rapidxml.hpp (420): ошибка C2061: синтаксическая ошибка: идентификатор «память»

И я как бы вижу, как это может запутать компилятор.Меня это тоже немного смущает.Что делает (memory) часть new(memory) xml_attribute<Ch> там?

Если я удаляю эту часть (memory), она прекрасно компилируется.
Кроме того, gcc прекрасно компилирует, включая (memory).

Редактировать:
О, и я перегрузил new с помощью DEBUG_NEW, чтобы выполнить некоторую отладку памяти.DEBUG_NEW не поддерживает размещение новых.

Ответы [ 4 ]

3 голосов
/ 21 января 2011

У вас есть #include в этом файле?

3 голосов
/ 21 января 2011

Это мое предложение.Сама «память» определяется где-то также как макрос и расширяется, что вызывает проблему.Поэтому ищите #define.memory (используя регулярные выражения), чтобы увидеть, определена ли память как макрос.

Что касается следующего оператора, эта форма:

new(allocator) ObjectType(...)

используется, когда вы хотитеиспользовать свой собственный распределитель памяти для выделения памяти для вас.

Надеюсь, это поможет.

1 голос
/ 21 января 2011

Синтаксис new (pointer) type( argument ) называется Place New , и он в основном представляет собой вызов конструктора type с указанным argument по памяти, ранее выделенной в pointer.

Синтаксис, насколько он показан, правильный.Возможно, пара строк выше содержит пропущенную точку с запятой или синтаксическую ошибку, которая сбивает с толку синтаксический анализатор, но memory в качестве идентификатора соответствует правильности, определенной в предыдущей строке.(И это не зарезервировано языком для реализации)

1 голос
/ 21 января 2011

Это называется "размещение нового".Он создает экземпляр xml_attribute в memory вместо выделения новой памяти для него.См .:

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

Я не уверен, почему VC2010 имеет проблемы с синтаксисом.

...