gpt4 book ai didi

c++ - 为什么 "#define WC(p) L#p"在 GCC 和 Clang 中不起作用?

转载 作者:行者123 更新时间:2023-11-30 02:44:51 24 4
gpt4 key购买 nike

演示程序:

#include <iostream>
using namespace std;

#define WC(p) L#p

int main()
{
wcout << WC(XXX);
}

它在 Visual C++ 上运行良好,但无法在 Linux 上的 Clang 和 GCC 上编译。错误(clang 3.4,Linux):

  • file.cpp:8:11: 错误:使用了未声明的标识符“L”
  • file.cpp:4:15: 注意:从宏“WC”扩展

为什么会失败?如何使用 C 定义创建宽字符字符串文字?在我的案例中,这种能力将大大减少代码重复。

最佳答案

预处理器对一系列标记进行操作。

在宏WC(p)的定义中,替换列表中有3个标记:L#p# 是一个运算符,当然,它将以下标记“字符串化”。重要的是 L 本身就是一个标记。 WC(XXX) 上的宏替换结果是两个 标记:L"XXX"

另一方面,宽字符串文字是单个 标记。无论宏替换列表的拼写如何,两个单独的标记,其中一个是 L,另一个是窄字符串文字,构成宽字符串文字。与 L "XXX" 相同,带一个空格。

您需要将两个标记粘贴到一个标记中以获得宽字符串文字。这提出了以下解决方案:

#define WC(p) L ## #p

编辑:但是,正如评论中所指出的,这可能也行不通,因为该语言不保证 # 将在 ## 之前被评估。我们必须先强制​​预处理器将 p 转换为字符串,然后粘贴标记:

#define CONCAT(x, y) x ## y
#define WC(p) CONCAT(L, #p)

现在 WC(XXX) 将首先进行宏替换以产生 CONCAT(L, "XXX")。然后进一步的宏替换产生单个标记 L"XXX"

关于c++ - 为什么 "#define WC(p) L#p"在 GCC 和 Clang 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com