我下面有演示代码。我希望结果将被初始化为数组。
#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'令牌也可以正常使用。有什么提示吗?使用32b mingw 5.3.0。
答案 0 :(得分:0)
让我们只看一个调用;我选一个:
name
预处理器首先执行参数替换。在此阶段,如果参数({ _NAME },
)在替换列表中(name
;我只是在这里去除空白),并且没有被字符串化或参与粘贴,则该参数完全展开并将结果替换为参数。在此,{ _NAME },
不会出现在该替换列表中,因此没有任何事可做。因此,在替换参数后,您有了_NAME
。
下一步是重新扫描并进一步替换(在字符串化和粘贴之后,没有)。在此阶段,将重新扫描剩余的令牌,以便宏可以展开(在对当前宏进行蓝色绘制之后,但这在此无效)。在此阶段,name
被识别为类对象宏,因此开始扩展。碰巧会扩展到name
,但是我们已经完成了参数替换,因此它与 parameter {{1}}无关……这只是另一个标记