前言
最近,在阅读uboot的源码过程中,发现了一段宏定义代码:
#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
_usage, _help, _comp) \
{ #_name, _maxargs, _rep, _cmd, _usage, \
_CMD_HELP(_help) _CMD_COMPLETE(_comp) }
在__name之前,带了一个#号,以前只知道宏定义中的##是用于连接两部分的内容,那么#号的作用是什么呢?
#号的作用
在C语言的宏定义中,#的功能是将其后面的参数进行字符串化操作,也就是说,对它所引用的宏变量通过替换后在其左右各加上一个双引号。
下面,我们用一段简单的代码,进行测试。
#include <stdio.h>
typedef struct {
char *name;
}CMD;
#define DECLARE_CMD(__name) {#__name};
CMD test = DECLARE_CMD(test_string);
// CMD test = DECLARE_CMD(”test_string”);
void main(void)
{
printf("%s", test.name);
return 0;
}
编译运行,可以看到代码会输出:
test_string
因为宏定义的作用是直接进行替换,倘若此处不加“#”号,则需要在传入的宏参数加上双引号“”,以保证传入的数据是字符串类型的数据,否则的话,编译时便会提示错误。