C前序宏链

  • 本文关键字:前序 c-preprocessor
  • 更新时间 :
  • 英文 :


下面有演示代码。我希望结果会被初始化数组。

#define _NAME name
#define CFIT(name)
{ _NAME },
const char * idns[] = {
CFIT("address")
CFIT("device_id")
CFIT("device_bh")
CFIT("device_hw")
CFIT("device_fw")
"" };

但是预处理程序创建了这个:

const char * idns[] = {
{ name },
{ name },
{ name },
{ name },
{ name },
""
};

令人惊讶的是,C++预处理器的工作与预期的一样。将_NAME宏直接替换为"NAME"标记也同样有效。有什么提示吗?使用第5.3.0条规定的32b。

让我们只看一个调用;我会选择这个:

CFIT("address")

预处理器首先执行参数替换。在这个阶段,如果参数(name(在替换列表中({ _NAME },;我只是在这里去掉空白(,并且没有被字符串化或参与粘贴,那么参数将被完全展开,结果将被参数替换。这里,name没有出现在替换列表中,所以没有什么可做的。所以在参数替换之后,就有了{ _NAME },

下一步是重新扫描并进一步替换(在发生字符串化和粘贴之后,没有(。在这个阶段,将重新扫描剩余的标记,以便宏可以展开(在蓝色绘制当前宏之后,但这在这里没有影响(。在这个阶段,_NAME被识别为一个类似对象的宏,因此它的扩展开始了。这恰好扩展到name,但我们已经完成了参数替换,因此它与参数name在这一点上没有关系。。。这只是另一个象征。

最新更新