2009-07-14 4 views
2

Я работаю над получением решения Visual C++ 2005 для компиляции в unicode. Тем не менее, в некоторых из моих проектов (но не все), я получаю ошибки в форме:Visual C++ Unicode String Literal дает ошибку: 'L': uneclared identifier

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 является частью синтаксиса языка. Кто-нибудь знает, есть ли какой-нибудь флаг где-нибудь, который должен быть включен в проекте или компилировать параметры, которые, если не переключить, могут вызвать это? Действительно странная часть - это не все из этого, это лишь некоторые из них. Кажется, он совместим в рамках одного проекта, но у меня есть целые проекты, которые компилируются отлично, а другие, которые терпят неудачу, как это.

+0

Как определяется LOGERROR или UTILITY? – jalf

+0

Префикс L не дает вам строковый литерал Юникода. Строковые литералы Unicode определены в C++ 11 и можно увидеть здесь: http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals – Verax

ответ

1

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

+0

Бинго. LOGERROR фактически использовал __FILE__, чтобы получить имя файла и попытаться преобразовать его в широкоформатный литерал с использованием других макросов, и именно там возникла ошибка, а не в фактической строке, передаваемой в LOGERROR. –

0

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

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

wchar_t const* foo = L "foo"; 

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

0

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

Смежные вопросы