【问题标题】:C++ preprocessor for creating string literals用于创建字符串文字的 C++ 预处理器
【发布时间】:2014-07-02 10:35:19
【问题描述】:

我需要做类似的事情:

#define charSz 16

#if charSz == 8
    typedef char8_t Char;
    #define STR(s) #s
#elif charSz == 16
    typedef char16_t Char;
    #define STR(s) u ## #s
#elif charSz == 32
    typedef char32_t Char;
    #define STR(s) U ## #s
#endif 

#include <string>
typedef std::basic_string< Char > String;

int main(){

  String s=STR(nice) ;
  String t=STR(very nice) ;
  String u=STR(good) ;

  return 0;

}

但是预处理器有问题

allocator.cpp:24:21: 错误:粘贴 "u" 和 ""good"" 不会给出有效的预处理令牌

【问题讨论】:

  • 您使用的是gccclang 的哪个版本?在coliru.stacked-crooked.com为我工作
  • 另外,你用的是什么模式? u"" 字符串字面量是 C++11 中的新内容,因此代码自然不会在 C++03 模式下工作。
  • 看起来您正在使用 g++ 进行编译,但没有提供 -std=c++11 选项。
  • @MattClarkson 使用的版本是:g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
  • @JosephMansfield 。我用 -std=c++11 编译,一切正常!

标签: c++ c-preprocessor


【解决方案1】:

那些 u""/U"" 字符串文字仅适用于 C++11 及更高版本,旧版本的 C++ 不支持。

如果您的编译器支持 C++11 并且您的项目允许使用它,则启用 C++11 编译(例如,使用 -std=c++11 开关的 g++ 和 clang++)。

否则,你就不走运了。较旧的 L"" 不是 UTF-16 字符串的合适替代品,而且根本没有任何 32 位宽的字符串文字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2011-11-28
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多