Visual C ++ Unicode String Literal выдает ошибку: 'L': необъявленный идентификатор - PullRequest
2 голосов
/ 14 июля 2009

Я работаю над получением решения Visual C ++ 2005 для компиляции в Unicode. Однако в некоторых моих проектах (но не во всех) я получаю ошибки в виде:

1>.\CBitFlags.cpp(25) : error C2065: 'L' : undeclared identifier

и соответствующая строка кода:

LOGERROR(UTILITY, L"Tried to use object to store %d flags, when max is %d",

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

Ответы [ 3 ]

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

Проблема почти наверняка внутри макроса LOGERROR. Посмотрите, как это относится к этому второму параматеру. Расширяйте макрос самостоятельно, иногда легко пропустить небольшие ошибки в макросах.

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

Visual C ++ 2005 поддерживает синтаксис L для широких строк и не требует каких-либо специальных флагов или чего-либо для его поддержки. Так что, скорее всего, ваша проблема в другом месте. Возможно определение LOGERROR или UTILITY. Или пропущенная точка с запятой ранее, или ... Это может быть что угодно, что заставляет компилятор ожидать чего-то другого, кроме строкового литерала, когда он попадает в L.

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

Поскольку это, по-видимому, что-то, используемое в макросе, я думаю, вам следует взглянуть на определение макросов LOGERROR и UTILITY и на то, на что они распространяются в контексте вашего кода. Используйте параметр компилятора /P, чтобы предварительно обработать ваши файлы, не переходя к шагу компиляции, а затем посмотрите на результат, чтобы увидеть то, что действительно видит компилятор.

Я могу воспроизвести ошибку, которую вы видите, если у меня есть пробел после L:

wchar_t const* foo = L "foo";

Вы уверены, что скопировали и вставили фактический код, который доставляет вам проблемы?

...