下面有演示代码。我希望结果会被初始化数组。
#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
在这一点上没有关系。。。这只是另一个象征。