Ошибка «необъявленный идентификатор» в простом раскрытии макроса - PullRequest
0 голосов
/ 20 мая 2009

У меня есть очень простой макрос, который я использую для сокращения при объявлении исключений. В режиме отладки добавляет текущий файл и номер строки.

Я нахожусь в процессе изменения своего кода для поддержки юникода, и внезапно я получаю ошибки "необъявленный идентификатор" всякий раз, когда используется мой макрос. Я, вероятно, упускаю что-то действительно простое, так как сам макрос довольно прост. Может кто-нибудь сказать, в чем проблема?

Вот объявление макроса:

#ifdef _DEBUG
#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), _T(__LINE__))
#else
#define EXCEPTION(msg, mm) Exception(msg, mm)
#endif

Я не думаю, что это необходимо, но на всякий случай вот объявление конструктора Exception:

Exception(LPCTSTR msg, BOOL manageMsg = FALSE, LPCTSTR f = NULL, int l = -1);

При компиляции в режиме выпуска я не получаю никаких ошибок, но когда в режиме отладки я получаю, так что это что-то с битами __FILE__ и __LINE__, но я не могу понять, что является реальной проблемой.

Ответы [ 2 ]

3 голосов
/ 20 мая 2009

Макрос __LINE__ оценивается как целое число. Макрос _T помещает L в начало строк, чтобы сделать их строками Unicode. За ним следует двойная кавычка, например L"file.cpp". Но в вашем случае за ним следует целочисленный литерал, который расширяется до __LINE__. Вы получаете что-то вроде этого: L23. Избавьтесь от второго _T звонка.

#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), __LINE__)

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

2 голосов
/ 14 июля 2009

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

Если вы видите это сообщение об ошибке с многострочным макросом, включите видимые пробелы в вашем редакторе. У вас может быть пробел после символа продолжения '\' в конце строки:

#define FOO_BAR(aFoo) \ 
    FOO_BASE(aFoo, "bar")

Пробел в конце заставляет синтаксический анализатор проанализировать первую строку определения макроса как завершенную (FOO_BAR расширяется до '\'), а вторая строка интерпретируется как объявление функции, отсюда "необъявленный идентификатор" aFoo "" ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...