本文主要是介绍C语言宏定义中#和##运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
宏定义可以包含两个专用的运算符:#和##
1, #运算符
#运算符将宏的一个参数转换为字符串字面量,所执行的操作可以理解为“字符串化”。它仅允许出现在带参数的宏的替换列表中。举个例子
#define PRINT_INT(n) printf(#n " = %d\n", n)
n之前的#运算符通知预处理器根据PRINT_INT的参数创建一个字符串字面量,因此
PRINT_INT(i/j);
会变为
printf("i/j" " = %d\n", i/j);
根据C语言的规则:当两条或更多条字符串字面量相邻时(仅用空白字符分割),编译器会把它们合并成一条字符串。
以上的语句等价于:
printf("i/j = %d\n", i/j);
2. ##运算符
##运算符可以将两个记号(如标识符)“粘合”在一起,成为一个记号。如果其中一个参数是宏参数,“粘合”会在形式参数被相应的实际参数替换后发生。考虑下面的宏:
#define MK_ID(n) i##n
当MK_ID被调用时
int MK_ID(1);
预处理后,这一声明变为
int i1;
3. 在u-boot中的应用
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
则下面的定义
U_BOOT_CMD(HelloWorld, 3, 1, HelloWorld_Cmd, "Print Hello World", "Just a Test");
预编译后变为
cmd_tbl_t __u_boot_cmd_HelloWorld Struct_Section =
{"HelloWorld", 3, 1, HelloWorld_Cmd,
"Print Hello World", "Just a Test"};
这篇关于C语言宏定义中#和##运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!