This question already has answers here:
How to concatenate twice with the C preprocessor and expand a macro as in “arg ## _ ## MACRO”?
                                
                                    (2个答案)
                                
                        
                                4年前关闭。
            
                    
这是代码。

#include <iostream>
using namespace std;

#define gao falsegao
#define fun(entity) \
    void fun_##entity() \
    {                     \
        std::cout << #entity << std::endl; \
    }

fun(gao);

int main()
{
    fun_gao();
    return 0;
}


该程序将编译并轻松运行。但为什么?我已经将gao定义为falsegao,生成的函数不应该是void fun_false_gao()吗?输出也应该是false_gao

请帮助我解决这个难题,什么时候进行替换?这背后的原理是什么?

最佳答案

您需要一个两层的fun

#define fun_(entity) \
    void fun_##entity() \
    {                     \
        std::cout << #entity << std::endl; \
    }

#define fun(entity) fun_(entity)


这将按预期工作。

C ++语言的宏替换规则防止预处理器递归替换与###运算符相邻的令牌中的宏名称。您需要附加级别的“隔离”,以确保在gaofalsegao之前将##替换为#

关于c++ - C++宏不能替代吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31800561/

10-13 09:09