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

时间:2015-12-27 03:16:14

标签: 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);
}    

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

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

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

std::wstring str = L"This is a string";

提前谢谢。

2 个答案:

答案 0 :(得分:6)

我认为构造无效,MSVC应该诊断它。

#运算符“字符串化”其参数,因此One变为"One" - 但在L之前,您有两个单独的标记,{{1} }和L

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

#

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

答案 1 :(得分:0)

使用GCC的Action选项进行检查后,-E前缀与代码中的字符串之间产生了一个空格,我猜测该空间是有害的。

此代码使用L运算符来连接令牌:

##