【问题标题】:#define argument stringized but to a wide string L" instead of "#define 参数字符串化但为宽字符串 L" 而不是 "
【发布时间】:2014-01-01 13:56:04
【问题描述】:

我需要将#define 参数字符串化为一个宽字符串。

所以当

#define c(x) x,#x

用作:

{c(maria),0,false},

给出:

{maria,"maria",0,false} // maria is a member of an enum.

我不知道怎么做,但要创建一个宽字符串。

我的意思是不要让"maria" 拥有L"maria"

【问题讨论】:

  • 请大家回答我:这种问题不应该标记为C而不是C++吗?即使 C++ 与 C 兼容,这种做法(宏和字符串化)也不是好的 C++。它的C
  • @Manu343726 不,C++ 与 C 不是 100% 兼容,即使在预处理阶段也是如此。
  • @Manu343726:但有时它是必要的。
  • @hvd 我知道,这就是我问的原因。我总是试图将 C 和 C++ 视为不同的语言,而这种标记为 C++ 的问题无济于事
  • @Manu343726 如果 OP 想要一个适用于 C++ 的答案,他应该将问题标记为 C++。如果问题被标记为 C,并且 OP 得到的答案仅适用于 C 而不是 C++,那么这对任何人有什么帮助?

标签: c++ c-preprocessor stringification


【解决方案1】:

你可以这样做:

#define c(x) x,L###x

## 连接对于将 L 和带引号的字符串组合成单个预处理标记是必要的(因为 Lstring-literal 标记的一部分)。 p>

#define c(x) x,L###x
c(Hello)

通过预处理器(使用clang++ -E test.cpp)坚持这一点:

Hello,L"Hello"

【讨论】:

  • 什么空格?我的在视觉工作室中完美地工作,而L ""(带空格)不起作用。所以它不会创建任何东西。
  • 不需要连接以避免出现空格,但需要避免将L 和字符串文字视为单独的标记(无论如何,在符合标准的实现中)。
  • @user2345215 使用 clang 我得到 Hello,L "Hello" 没有串联。我一直在寻找原因。
  • @sftrabbit 在标准 C++ 中,除了将其字符串化之外,没有其他方法可以查看预处理器输出,如果您尝试这样做,您会发现没有空格。 clang(以及 gcc 和其他)无论如何都会输出一个空格,以确保不会错误地连接标记。
  • @hvd 这是有道理的。更正了我的解释。
【解决方案2】:

你为什么不试试

#define c(x) x,L#x

编辑:显然,这仅适用于 Visual Studio。所以你应该像其他人建议的那样选择L###x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2018-05-08
    • 2017-02-25
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多