【问题标题】:What is ## syntax? [duplicate]## 语法是什么? [复制]
【发布时间】:2015-07-21 12:08:20
【问题描述】:

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

#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”是未定义的。有人见过这种语法吗?

【问题讨论】:

  • 令牌连接。在SO上多次询问和回答。与以往一样,困难在于找到正确的问题来复制它。
  • @LưuVĩnhPhúc - 如果我记得,Google 不允许在搜索中使用特殊字符,例如井号。或者它不尊重他们。例如,what does ## mean in C。前 5 个 页有 0 个相关结果。您必须使用不同的搜索引擎才能获得最佳结果。在这里,“最佳”与原始搜索词相关,而不是答案。
  • @jww 你可以在谷歌上搜索一些特殊符号,虽然这有点难,所以我需要使用“双哈希符号”,它可以工作。您也可以使用search engine for special characters

标签: c++ c-preprocessor


【解决方案1】:

## 是一个预处理运算符,用于连接两个标记。

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

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

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多