2009-07-14 4 views
2

私はUnicodeでコンパイルするためのVisual C++ 2005ソリューションを手に入れています。Visual C++のUnicode文字列リテラルがエラーを出しています: 'L':宣言されていない識別子

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を識別子として扱っているようです。誰かが、プロジェクトで有効にする必要があるいくつかのフラグがあるかどうかを知っていますか?本当に奇妙な部分は、これがすべてではないということです。 1つのプロジェクト内で一貫しているように見えますが、私はプロジェクト全体をコンパイルしており、他は悲惨にこのように失敗しています。

+0

LOGERRORまたはUTILITYはどのように定義されていますか? – jalf

+0

L接頭辞はあなたにUnicode文字列リテラルを与えません。 Unicodeの文字列リテラルはC++ 11で定義されています。http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals – Verax

答えて

1

問題はほとんど確実にLOGERRORマクロの内部にあります。その2番目のパラメタをどのように扱うかを見てください。自分でマクロを展開すると、マクロの小さなエラーを時々見逃すことがあります。

+0

Bingoで見ることができます。 LOGERRORは実際には__FILE__を使用してファイル名を取得し、他のマクロを使用してその文字列をワイド文字に変換しようとしましたが、実際にはLOGERRORに渡される文字列ではなくエラーが発生していました。 –

0

これはマクロで使用されているように思われるので、LOGERRORUTILITYというマクロの定義と、コードのコンテキストでどのように展開するのかを見てください。 /Pコンパイラオプションを使用して、コンパイルステップに進むことなくファイルを前処理し、結果を見てコンパイラが実際に見ていることを確認します。

私はLの後にスペースを持っている場合は、表示されるエラーを再現することができます

wchar_t const* foo = L "foo"; 

は、あなたがコピーして、あなたにトラブルを与えている実際のコードを貼り付けましたか?

0

Visual C++ 2005はワイド文字列のL構文をサポートしており、特別なフラグなどを必要としません。だから、おそらくあなたの問題は他の場所にあります。おそらくLOGERRORまたはUTILITYの定義。以前にセミコロンが見つからなかったり、セミコロンが見つからなかったりすると、コンパイラに文字列リテラル以外のものが必要になることがあります。

関連する問題