【C语言笔记】【linux宏定义系列】 粘连参数
linux宏定义系列内容。用于记录在linux之中各式各样的宏定义?。
宏定义说明
用于将两个参数粘连到一起,变成一个参数。
例如将test 和code 粘连到一起,变成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;
}
实现过程
-
通过## 运算实现该宏,## 是一个用于把参数宏中的形参粘连在一起的运算符。 -
宏定义中为何多套了一层?改成#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
|