我阅读了一些示例代码,并了解了我以前从未见过的##语法。代码示例如下:
#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”未定义。有没有人见过这种语法?
答案 0 :(得分:3)
##
是一个连接两个令牌的预处理器运算符。
来自http://en.cppreference.com/w/cpp/preprocessor/replace
替换列表中任意两个连续标识符之间的##运算符运行两个标识符(首先不进行宏扩展)的参数替换,然后连接结果。此操作称为“串联”或“标记粘贴”。只能一起形成有效令牌的令牌:形成较长标识符的标识符,形成数字的数字,或形成+ =的运算符+和=。无法通过粘贴/和*来创建注释,因为在考虑宏替换之前会从文本中删除注释。如果连接的结果不是有效令牌,则行为未定义。