我不确定这是否是正确使用的术语,但是我的问题是宏调用(“PLUGIN_NAME”)作为另一个宏调用(“IMPLMENT_MODULE”)的参数,这反过来将其打印为字符串,打印该参数作为宏调用(“somePLUGIN_NAME”)而不是扩展结果(“someSomePluginName”)。
请注意,“IMPLMENT_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);
}
Run Code Online (Sandbox Code Playgroud)
我把它放在这里: http: //codepad.org/FRzChJtD
您需要另一个辅助宏来在宏扩展后连接预处理器标记:
#define IMPLEMENT_MODULE_2(A, B) A##B
#define IMPLEMENT_MODULE(name) IMPLEMENT_MODULE_2(something, name)
Run Code Online (Sandbox Code Playgroud)
请参阅此处的工作示例
该技术解释是,如果预处理器找到标记粘贴(##)或字符串化运算符(#),则不会发生宏扩展。
| 归档时间: |
|
| 查看次数: |
8717 次 |
| 最近记录: |