C前处理器宏链

时间:2018-12-07 15:34:42

标签: 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'令牌也可以正常使用。有什么提示吗?使用32b mingw 5.3.0。

1 个答案:

答案 0 :(得分:0)

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

name

预处理器首先执行参数替换。在此阶段,如果参数({ _NAME },)在替换列表中(name;我只是在这里去除空白),并且没有被字符串化或参与粘贴,则该参数完全展开并将结果替换为参数。在此,{ _NAME },不会出现在该替换列表中,因此没有任何事可做。因此,在替换参数后,您有了_NAME

下一步是重新扫描并进一步替换(在字符串化和粘贴之后,没有)。在此阶段,将重新扫描剩余的令牌,以便宏可以展开(在对当前宏进行蓝色绘制之后,但这在此无效)。在此阶段,name被识别为类对象宏,因此开始扩展。碰巧会扩展到name,但是我们已经完成了参数替换,因此它与 parameter {{1}}无关……这只是另一个标记