c++ - 宏在C++中展开

标签 c++ macros

定义两个宏,如下所示:

#define MACRO_COMBINE_INNER(A,B) A##B
#define MACRO_COMBINE(A,B) MACRO_COMBINE_INNER(A,B)

我们使用这些宏
MACRO_COMBINE_INNER(ABC,__LINE__)
MACRO_COMBINE(ABC,__LINE__)

如果当前行号是123,则为 LINE == 123,为什么从两个宏扩展结果的原因是:
ABC__LINE__
ABC123

最佳答案

扩展顺序在这里起作用,首先是离群宏被扩展,然后是内部宏。在第一种情况下,扩展MACRO_COMBINE_INNER后,您将获得:

  ABC##__LINE__

变成ABC__LINE__,因为__LINE__在这里不是单独的标记。在第二种情况下,预处理器扩展MACRO_COMBINE(ABC,__LINE__),然后
__LINE__被扩展。 `
  MACRO_COMBINE_INNER(ABC,123)

然后扩展MACRO_COMBINE_INNER
  ABC##123

stringify运算符有类似的行为,需要创建这样的宏
#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)

为了能够在字符串文字中使用__LINE__:
#define THROW_BAD_INDEX(x) throw std::out_of_range \
                           (__FILE__ ":" STRING(__LINE__) ": Bad index")

关于c++ - 宏在C++中展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946161/

相关文章:

c++ - 如何修改运行时加载的 DLL 的导入地址表

c++ - Visual C++ 只有一个线程在工作 (OpenMP)

c++ - 宏与模板结合生成Object

android - 何时在 Android NDK 中使用 JNIEXPORT 和 JNICALL?

python - 如果特定文件夹不存在,请调整 Plone 的宏以不显示任何内容?

c++ - std::set::insert,我能暗示多糟糕?

c++ - 在调用 std::map::find 时跟踪节点遍历?

c++ - 这个指针值不能转换为整数的规则是什么?

c - 如何将 KdPrint 定义为 DbgPrint?

c++ - 如何检查宏参数中是否有赋值?