c++ - 嵌套宏扩展

标签 c++ macros

我不确定这是否是正确使用的术语,但我的问题是宏调用(“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

最佳答案

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

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

查看工作 example here

此技术解释是,如果预处理器找到标记粘贴 (##) 或字符串化运算符 (#),宏扩展将不会发生

关于c++ - 嵌套宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31610231/

相关文章:

c++ - 获取当前命名空间和函数名(但不是完整签名)的宏?

rust - 将宏参数传递给其他宏

c++ - 将文件中的数据分配给矩阵 C++

c++ - "Double"函数与 C++0x

python - Python 和 C 的单一源文件

c - 替换许多字符串常量的宏

c++ - 对 C 宏的 undefined reference ,但在我定义它时会出现重新定义的错误

c++ - 对指向 const 对象的非常量指针的非常量引用

c++ - 在没有模板特化的情况下更改函数的返回类型。 C++

c++ - 从文本文件读取到 C++ 中的数组?