【C】C语言中宏定义连接符##和转换符#的用法详解
目录
Date: 2018.9.17
1、参考
https://blog.csdn.net/cbnotes/article/details/50388325
https://blog.csdn.net/gordennizaicunzai/article/details/80473180
2、宏定义中特殊符号的含义
- 宏定义语句连接符 \ : 在C/C++宏定义中规定,宏定义只允许写在同一行,下一行就不属于这个宏定义了,而实际定义宏过程中,经常会出现较复杂的宏定义,较长,写在一行不易于读懂,需按逻辑关系断行编写,此时需要在行的末尾用连接符“\”进行连接,表示上下行属于同一行,即同属于这个宏定义。
- 宏定义参数连接符 ##:##主要用于将宏定义中的两个token链接起来,这里的token可以是宏的变量,也可以是任意参数或者标记。
- 宏定义符号#: #能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号。
- 宏定义符号#@:将标记转换为相应的单个字符,注意:仅对单一标记转换有效。例如
#define B(x) #@x
则B(a)即’a’,B(1)即’1’.但对B(abc)却不甚有效.
举例如下:
#include<stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
#define k(a) #@a
#define test(type) \
test1(type,1) \
test1(type,4) \
test1(type,6) \
test1(type,8)
int main()
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
printf("%s\n",k(m));
return 0;
}
输出为:
12
12
m
进一步理解一下这两个宏定义符号的含义:
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。
#符是把传递过来的参数当成字符串进行替代。
THE END!
本文为博主原创文章,未经博主允许不得转载。若允许转载,请注明来源https://www.cnblogs.com/SoaringLee/,否则保留追究法律责任的权利!
另外,本人提供付费咨询服务并长期承接各类毕设以及外包项目。联系QQ:2963033731。加Q备注:CNBLOG外包