gpt4 book ai didi

c++ - 使用 define 指令获取命名空间名称

转载 作者:行者123 更新时间:2023-12-02 16:08:00 25 4
gpt4 key购买 nike

有了这么简单的C++代码:

#include <iostream>

#define NS NS_Static
#define MAKESTRING(x) #x

namespace NS {
int global_x = 8;
void print_global_x() {
std::cout << MAKESTRING(NS) << "::global_x: " << global_x << std::endl;
}
}

我希望得到输出 NS_Static::global_x: 8 但只得到 NS::global_x: 8。我之前问过一个类似的问题,用户 Eljay 为我提供了使用这样一个额外代码的答案:

#define NS Static
#define MAKESTRING_HELPER(x) #x
#define MAKESTRING(x) MAKESTRING_HELPER(x)

它终于起作用了,但是有人可以解释一下为什么我原来的方法不起作用吗?

预处理器(在我原来的方法中)不应该首先(因为它是定义的第一个宏)运行 NS NS_Static 宏导致NS_Static,然后将该 NS_Static 传递给字符串化 MAKESTRING(x) #x 宏,生成预期的 NS_Static 字符串?

最佳答案

就是这样stringizing (#x) 在 C 预处理器中有效。

Unlike normal parameter replacement, the argument is not macro-expanded first.

要使参数进行宏扩展,请添加另一层间接(像您发现的那样的无操作宏就足够了)。

关于c++ - 使用 define 指令获取命名空间名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68864529/

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