我怎样才能在另一个宏中使用一个宏,以便将宏的定义连接到某个东西? C/C++

How can I use a macro inside another macro in order to concat the definition of the macro to something? C/C++

我正在尝试制作一个宏,它将采用预定义的前缀并将其连接到宏参数中所需的函数名称,但我一直没有成功。

例如,虽然这是想要的函数签名:

void somePrefix__someFunc(int a)

但是,当我 运行 它并检查程序的符号 table 时,我最终扩展了:

FUNC_PREFIXsomeFunc

我哪里做错了,我怎样才能正确地做到这一点?

我尝试的代码 运行:

#include <iostream>
#define CONCAT(A, B) A##B
#define FUNC_PREFIX somePrefix__
#define FUNC_NAME(_func) CONCAT(FUNC_PREFIX, _func)

void FUNC_NAME(someFunc)(int a)
{
    std::cout << a << std::endl;
}

int main()
{
    FUNC_NAME(someFunc)(2);
    return 0;
}

P.S: 我尝试使用没有 CONCAT 包装器的宏(直接尝试连接 FUNC_PREFIX##_func),但它仍然不起作用。

## 总是在(重新)扫描宏“替换列表”之前应用,因此如果 CONCAT 在其他项目之前展开,我们将无法获得所需的结果.每当我们在宏替换期间在替换列表中以 ## 结束时,它就会在任何进一步替换之前应用。

所以你需要一个额外的辅助宏来扩展FUNC_PREFIX,这样它在CONCAT之前被扩展为:

#include <stdio.h>
#define CONCAT(A, B) A##B
#define CONCAT_EXPAND(A, B) CONCAT(A,B)
#define FUNC_PREFIX somePrefix_
#define FUNC_NAME(func) CONCAT_EXPAND(FUNC_PREFIX, func)

void FUNC_NAME(someFunc)(int a)
{
    printf("%s: %d\n",__func__, a);
}

int main()
{
    FUNC_NAME(someFunc)(2);
    return 0;
}

输出:

somePrefix_someFunc: 2