假设这段代码:
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)
先感谢您.
我认为构造是无效的,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.
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |