有了这么简单的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/