嵌套宏扩展

时间:2015-07-24 12:10:52

标签: c++ macros

我不确定这是否是正确的术语,但我的问题是宏调用(“PLUGIN_NAME”)作为另一个宏调用(“IMPLEMENT_MODULE”)的参数,而后者又将其打印为string,将该参数打印为宏调用(“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 个答案:

答案 0 :(得分:2)

在宏扩展之后,您需要另一个辅助宏来连接预处理器标记:

#define IMPLEMENT_MODULE_2(A, B) A##B
#define IMPLEMENT_MODULE(name) IMPLEMENT_MODULE_2(something, name)

见工作example here

此技术说明如果预处理器找到令牌粘贴(##)或字符串化运算符(#),则不会发生宏扩展