你知道C语言中#和##表示的意义吗
作者:努力学习游泳的鱼
如标题,这篇文章会讲解C语言中的#和##是啥意思。我相信,大部分朋友应该都没怎么用过,这两个玩意的使用条件相当苛刻。
#用于把一个宏参数直接转换为相应的字符串。
##用于连接2个标识符。
1.#
先做一个小铺垫。C语言中允许把一个字符串拆成2个字符串。比如,下面2条语句是等价的。
printf("Hello, world!!!\n"); printf("Hello, ""world!!!\n");
也就是说,可以把"Hello, world!!!\n"拆成"Hello, “和"world!!!\n”。
而#可以把一个宏参数直接转换成相应的字符串。比如有下面这个宏:
#define CONVERT(a) #a
如果在某个地方这样调用:
int test_convert = 10; printf(CONVERT(test_convert));
在预处理之后,test_convert就会转换成相应的字符串,即"test_convert"。没错!直接把标识符作为文本转换成字符串!也就是说,上面2条语句会转换成这样:
int test_convert = 10; printf("test_convert");
屏幕上就会打印出test_convert这个字符串。
那么,假设有这么一个宏:
#define PRINT_MESSEGE(data, format) \ printf("The value of "#data" is "format".\n", data)
就很有意思了。结合上面的讲解,你猜猜下面的调用会输出什么?
int i = 10; PRINT_MESSEGE(i, "%d"); double d = 3.14; PRINT_MESSEGE(d, "%lf");
以PRINT_MESSEGE(i, "%d");为例。宏的第一个参数就是i,第二个参数就是"%d",具体就会替换成:printf("The value of ""i"" is ""%d"".\n", i)。根据前面讲解的字符串可以拆分的知识,这几个小的字符串也可以合并,就等价于:printf("The value of i is %d.\n", i)。所以输出结果就是:
2.##
##是用来连接2个标识符的。比如下面这个宏:
#define CAT(a, b) a##b
下面的代码就很有意思了:
int num5 = 20; printf("%d\n", CAT(num, 5));
解释一下,a##b就是字面意思的把a和b连起来。比如,CAT(num, 5)就会被替换成num5,所以上面的2条语句就会被替换成:
int num5 = 20; printf("%d\n", num5);
所以会输出20。
3.总结
1.#可以把对应的宏参数的文本直接替换成完全一模一样的字符串。比如#define CONVERT(name) #name这个宏,就会把变量a替换成字符串"a",变量num替换成字符串"num"。
2.##可以连接2个标识符。对于宏#define CAT(a, b) a##b,就是字面意思的把a和b的名字连起来,成为一个新的名字ab。比如CAT(num, 5)就会合成一个新的名字num5。
到此这篇关于你知道C语言中#和##表示的意义吗的文章就介绍到这了,更多相关C语言# ##内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!