gcc和clang预处理器不理解L前缀

Car*_*orm 2 c++ gcc

假设这段代码:

enum class Foo
{
    One,
    Two,
    Three,
    Four,
    Five
};

#define HANDLE_FOO(f) case Foo::f: std::wcout << L#f << std::endl;
Foo x = Foo::Five;
switch (x)
{
    HANDLE_FOO(One);
    HANDLE_FOO(Two);
    HANDLE_FOO(Three);
    HANDLE_FOO(Four);
    HANDLE_FOO(Five);
}    
Run Code Online (Sandbox Code Playgroud)

msvc编译恰到好处,但是gcc给出了这个错误:"'L'未在此范围内声明"

所以,问题是:我该如何解决这个问题呢?不仅'L'前缀不起作用,而且'u'等也不起作用.

这段代码编译得很好,但是:

std::wstring str = L"This is a string";
Run Code Online (Sandbox Code Playgroud)

先感谢您.

Kei*_*son 6

我认为构造是无效的,MSVC应该诊断它.

#运营商"stringizes"的说法,因此One成为"One"-但它前面有L你有两个独立的令牌,L"One".

你想要的是一个单一的标记,字符串文字L"One".您需要使用##令牌粘贴运算符以及#字符串化运算符:

#define HANDLE_FOO(f) case Foo::f: std::wcout << L ## #f << std::endl;
Run Code Online (Sandbox Code Playgroud)

实验表明,这适用于g ++ 5.3.0和clang ++ 3.6.