当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《gcc和clang预处理器不理解L前缀》经验,为你挑选了1个好方法。

假设这段代码:

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";

先感谢您.



1> Keith Thomps..:

我认为构造是无效的,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.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有