define中#和##以及__VA_ARGS_
经常看到别人写的代码中define有特殊操作符#和##。接下来就让我们看看他们代表的具体意思:
(1)#
假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化。
例如:
#incldue <stdio.h>
#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x))
int main(void)
{int y =4;PSQR(y);//输出:the square of y is 16.PSQR(2+4);//输出:the square of 2+4 is 36.return 0;
}
(2)##
##运算符可以用于类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。
例如:
#include <stdio.h>
#define XNAME(n) x##n
#define PXN(n) printf("x"#n" = %d\n",x##n)
int main(void)
{int XNAME(1)=12;//int x1=12;PXN(1);//printf("x1 = %d\n", x1);//输出:x1=12return 0;
}
(3)可变参数宏 …和__VA_ARGS__
__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏__VA_ARGS__就可以被用在替换部分中,替换省略号所代表的字符串。
例如:
#define PR(...) printf(__VA_ARGS__)
int main()
{int wt=1,sp=2;PR("hello\n");//输出:helloPR("weight = %d, shipping = %d",wt,sp);//输出:weight = 1, shipping = 2return 0;
}
省略号只能代替最后面的宏参数。
#define W(x,…,y)错误!
但是支持#define W(x, …),此时传入的参数个数必须能够匹配。
这里再介绍几个系统的宏:
1) __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的”,”去掉的作用,否则会编译出错, 你可以试试。
2) __FILE__ 宏在预编译时会替换成当前的源文件名
3) __LINE__宏在预编译时会替换成当前的行号
4) __FUNCTION__宏在预编译时会替换成当前的函数名称
define中#和##以及__VA_ARGS_相关推荐
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h&g ...
- #define中的三个特殊符号:#,##,#@
#define中的三个特殊符号:#,##,#@ (关于#define的用法,看这里 http://www.cppblog.com/kenny/archive/2011/04/26/145087.htm ...
- C++: #define中的三个特殊符号:#,##,#@
#define中的三个特殊符号:#,##,#@ 看下面三个define宏定义: #define Conn(x,y) x##y #define ToChar(x) #@x #define ToStrin ...
- c语言中 1ul什么意思,c语言 #define 中的UL
c语言 #define 中的UL U和L是 整数文字量的后缀修饰,用于显示指明整数文字量的类型为unsigned int(U)和long int(L). 类似的还有浮点数文字量的后缀修饰F或f,用于指 ...
- 第16章 C预处理器和C库 16.3 在#define中使用参数
2019独角兽企业重金招聘Python工程师标准>>> 通过使用参数,可以创建外形和作用都与函数相似的类函数宏(function-like macro). 类函数宏的定义中,用圆括号 ...
- C语言中#define中的一些特殊用法
转载自:http://blog.sina.com.cn/s/blog_4a4365030100edq7.html define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方 ...
- #define中 #与##的神奇用法
本文整理自csdn. #define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ) { puts(d(f(a, ...
- #define中宏定义中的空格
宏定义中的空格 另外还有一个问题需要引起注意,看下面例子: #define SUM (x) (x)+(x) 复制代码 这还是定义的宏函数SUM(x)吗?显然不是.编译器认为这是定义了一个宏:SUM,其 ...
- #define中的“\”作用
在C++中,我们在定义#define宏时是要保持在一行的,而有时候定义内容可能不是很美观,影响阅读,而在这时我们就可以使用 " \ " 强制转行,使编译器仍将换行后认为是同一行,增 ...
最新文章
- X-UA-Compatible也无法解决的IE11兼容问题
- lodash源码分析之获取数据类型
- [原]《Web前端开发修炼之道》-读书笔记CSS部分
- 【转】storm 开发系列一 第一个程序
- 星尘小组第八周翻译-数据页和数据行
- COSCon'18 面向全宇宙招募志愿者啦!
- 【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN
- zookeeper 和 kafka 集群搭建
- 【白皮书分享】2022年私域运营趋势及创业机会.pdf(附下载链接)
- 深度解析国内主流离线编程软件
- 软件工程专业如何论文选题?
- 大学四年软件工程专业的学习经验总结
- 数据分析师培训班哪家好?
- java 人脸活体检测_人脸识别活体检测测试案例
- 头条小程序对接微信、支付宝
- realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声...
- R语言 多个变量进行 卡方检验 循环 fisher检验 chi test 循环
- Python个人博客项目-3.用户应用开发
- 端口绑定技术基础介绍
- Hashmap如何实现key的唯一性
热门文章
- pathon fastapi报错value is not a valid dict (type=type_error.dict)
- 12个Java长久占居主要地位的原因
- element ui 表格里面放图片
- linux下fstat、stat和lstat 区别(转)
- 秋月之谋:早评黄金1505空单精准出击,空军在下一城!原油保持观望
- 实例1QQ好友列表界面和九宫格
- 在CSS中创建径向菜单
- 生日快乐的代码_贺渝同学生日快乐!
- 了解汽车上的OBD-II接口
- zynq 黑金 linux 教程,【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验...