嵌套宏展开

6

我不确定是否使用了正确的术语,但我的问题是将一个宏调用(“PLUGIN_NAME”)作为另一个宏调用(“IMPLEMENT_MODULE”)的参数,后者将其作为字符串打印出来时,将该参数打印为宏调用(“somePLUGIN_NAME”),而不是展开结果(“someSomePluginName”)。

请注意,“IMPLEMENT_MODULE”是一个API调用,因此我无法更改它。

#define IMPLEMENT_MODULE(name) something##name

#define PLUGIN_NAME SomePluginName
#define _STR(s) #s
#define STR(s) _STR(s)
#define PLUGIN_NAME_STR STR(PLUGIN_NAME)

int main()
{
    string expected = "somethingSomePluginName";
    string actual = STR(IMPLEMENT_MODULE(PLUGIN_NAME));

    printf("expected: %s || actual: %s\n", expected.c_str(), actual.c_str());
    assert(expected == actual);
}

我已经把它放在这里:http://codepad.org/FRzChJtD
1个回答

6
你需要另一个帮助宏来连接预处理器标记并在宏扩展后将它们合并:
#define IMPLEMENT_MODULE_2(A, B) A##B
#define IMPLEMENT_MODULE(name) IMPLEMENT_MODULE_2(something, name)

请查看此处的 运行示例

这是一个关于技术的解释:如果预处理器发现了连接符(##)或字符串化符号(#),则宏扩展将不会发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接