假设此代码:
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";
提前谢谢。
答案 0 :(得分:6)
我认为构造无效,MSVC应该诊断它。
#
运算符“字符串化”其参数,因此One
变为"One"
- 但在L
之前,您有两个单独的标记,{{1} }和L
。
你想要的是一个单一的标记,即字符串文字"One"
。您需要使用L"One"
令牌粘贴运算符以及##
字符串化运算符:
#
实验表明,这适用于g ++ 5.3.0和clang ++ 3.6。
答案 1 :(得分:0)
使用GCC的Action
选项进行检查后,-E
前缀与代码中的字符串之间产生了一个空格,我猜测该空间是有害的。
此代码使用L
运算符来连接令牌:
##