【C语言笔记】【宏定义系列】 粘连参数

本文详细介绍了Linux中如何通过宏定义将两个参数粘连,如test和code结合成testcode,并提供了实际代码示例和预处理后的效果分析。特别强调了宏定义中套层的重要性以及使用##运算符的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【C语言笔记】【linux宏定义系列】 粘连参数

linux宏定义系列内容。用于记录在linux之中各式各样的宏定义☺。

宏定义说明

用于将两个参数粘连到一起,变成一个参数。

例如将testcode粘连到一起,变成testcode

实现代码

#define __CONCAT(a, b) a ## b
#define CONCATENATE(a, b) __CONCAT(a, b)

宏定义中:

a和b表示要粘连到一起的参数。

示例程序

void test1(void)
{
    printf("test1\n");
}

void test2(void)
{
    printf("test2\n");
}

int main(int argc, char* argv[])
{
    int testarg1 = 66;
    int testarg2 = 333;
    
    CONCATENATE(test, 1)();
    CONCATENATE(test, 2)();
    
    printf("%d\n", CONCATENATE(test, arg1));
    printf("%d\n", CONCATENATE(test, arg2));
    
    return 0;
}

运行后,结果为

test1
test2
66
333

其中test和1粘连到一起变成test1,变成运行函数test1(),打印出test1;test和2粘连到一起变成test2,变成运行函数test2(),打印出test2。

test和arg1粘连到一起变成参数testarg1,所以打印结果为66;test和arg2粘连到一起变成参数testarg2,所以打印结果为333。

查看预处理后的情况,替换与粘连的情况与预期一致。

int main(int argc, char* argv[])
{
    int testarg1 = 66;
    int testarg2 = 333;

    test1();
    test2();

    printf("%d\n", testarg1);
    printf("%d\n", testarg2);

    return 0;
}

实现过程

  1. 通过##运算实现该宏,##是一个用于把参数宏中的形参粘连在一起的运算符。

  2. 宏定义中为何多套了一层?改成#define CONCATENATE(a, b) a ## b可以吗?

    在使用到##对参数宏中的形参进行粘连的时候,一定要在外面再多套一层。

    如果改成#define CONCATENATE(a, b) a ## b这种写法时,如果是上面的示例程序的话,结果没有变化。但是如果是改成下面这样子,就会出问题:

    int main(int argc, char* argv[])
    {  
    #define INDEX1  1
    #define INDEX2  2
    #define ARG1    arg1
    #define ARG2    arg2
    
        int testarg1 = 66;
        int testarg2 = 333;
    
        CONCATENATE(test, INDEX1)();
        CONCATENATE(test, INDEX2)();
        
        printf("%d\n", CONCATENATE(test, ARG1));
        printf("%d\n", CONCATENATE(test, ARG2));
        
        return 0;
    }
    

    上面的示例程序将参数使用#define来定义。

    结果编译就会提示出错。

    查看预处理后的情况:

    int main(int argc, char* argv[])
    {
        int testarg1 = 66;
        int testarg2 = 333;
    
        testINDEX1();
        testINDEX2();
    
        printf("%d\n", testARG1);
        printf("%d\n", testARG2);
    
        return 0;
    }
    
    

    会发现并没有按照我们的预先进行粘连。变成了直接和#define定义的参数进行粘连了。

    如果在外部再多套一层,变成我们原本宏定义的样子,就会发现可以正常编译,结果也和预期一致、

[参考资料]

linux kernel 5.8

/include/linux/kernel.h


本文链接:https://blog.csdn.net/u012028275/article/details/118853228

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值