假设这段代码:
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";
先感谢您.
我认为构造是无效的,MSVC应该诊断它.
该#
运营商"stringizes"的说法,因此One
成为"One"
-但它前面有L
你有两个独立的令牌,L
和"One"
.
你想要的是一个单一的标记,字符串文字L"One"
.您需要使用##
令牌粘贴运算符以及#
字符串化运算符:
#define HANDLE_FOO(f) case Foo::f: std::wcout << L ## #f << std::endl;
实验表明,这适用于g ++ 5.3.0和clang ++ 3.6.