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

标签 c++

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

相关文章:

c++ - 通过外部包装程序访问exe程序中ListView的数据

c++ - OpenGL更新部分VBO(点云)

c++ - 您可以在 CRTP 方法中对派生类使用约束吗?

c++ - 我的以下断言是否正确?

c++ - 为什么选择 "universal reference"重载而不是 char 数组或 char 指针?

c++ - 删除动态数组C++中的单个元素

C++ 将未知函数作为参数传递

java - 是否有可能使函数像 for 循环一样工作?

C++ 为什么在栈中构造完对象后立即调用析构函数?

c++ - 如何验证自签名证书?