連結によって形成された多くの定数文字列(数字など)があるプロジェクトに取り組んでいます。
たとえば、メッセージやエラーを出力するときに、コード内のどこにいるかを知るために使用できる文字列にLOCATION
フォーマットするマクロが__FILE__
あります。__LINE__
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
したがって、これは「file.cpp(42)」のような場所をフォーマットします。問題は、結果をワイド文字列に変換しようとしたときです。
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
これは GCC で問題なく動作し、L"file.cpp(42)" がコードに挿入されます。ただし、MSVC++ (Visual C++ 2008 Express を使用) でこれを試みると、エラーが発生します。
error: Concatenating wide "file.cpp" with narrow "("
L
プレフィックスが式の最初の項にのみ追加されることを理解しています。私もこれを試しました:
#define _WIDEN(x) L ## #x
これは「機能します」がL"\"file.cpp\" \"(\" \"42\" \")\""
、特にこのマクロが他のマクロと比較して単純であることを考えると、明らかにあまり便利ではない (そして私が探しているものではない) 文字列を提供します。
それで、私の質問は次のとおりです。MSVC ++の式全体に適用するにはどうすればよいので、GCCで得ているのと同じ結果を得ることができますか? 全幅のトークンを含む 2 番目の文字列を作成したくはありません。これは、マクロごとに 2 つのマクロを維持する必要があり、あまり便利ではなく、バグにつながる可能性があるためです。さらに、各文字列の狭いバージョンも必要なので、残念ながらすべて広い文字列を使用することもできません。