什么是##语法?

时间:2015-05-11 05:09:32

标签: c++ c-preprocessor

我阅读了一些示例代码,并了解了我以前从未见过的##语法。代码示例如下:

#define DEF_MAKE_BT_1_COMP(BT)\
inline i_##BT make_i_##BT(i_##BT::vtype x) { return make_##BT(x); }

#define DEF_MAKE_BT2(T)         \
DEF_MAKE_BT_1_COMP(T##1);           \
DEF_MAKE_BT_2_COMP(T##2);

DEF_MAKE_BT2(double);

当我在最后一行收到错误时,“make_double1”未定义。有没有人见过这种语法?

1 个答案:

答案 0 :(得分:3)

##是一个连接两个令牌的预处理器运算符。

来自http://en.cppreference.com/w/cpp/preprocessor/replace

  

替换列表中任意两个连续标识符之间的##运算符运行两个标识符(首先不进行宏扩展)的参数替换,然后连接结果。此操作称为“串联”或“标记粘贴”。只能一起形成有效令牌的令牌:形成较长标识符的标识符,形成数字的数字,或形成+ =的运算符+和=。无法通过粘贴/和*来创建注释,因为在考虑宏替换之前会从文本中删除注释。如果连接的结果不是有效令牌,则行为未定义。

相关问题