经常看到别人写的代码中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_相关推荐

  1. volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

     1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h&g ...

  2. #define中的三个特殊符号:#,##,#@

    #define中的三个特殊符号:#,##,#@ (关于#define的用法,看这里 http://www.cppblog.com/kenny/archive/2011/04/26/145087.htm ...

  3. C++: #define中的三个特殊符号:#,##,#@

    #define中的三个特殊符号:#,##,#@ 看下面三个define宏定义: #define Conn(x,y) x##y #define ToChar(x) #@x #define ToStrin ...

  4. c语言中 1ul什么意思,c语言 #define 中的UL

    c语言 #define 中的UL U和L是 整数文字量的后缀修饰,用于显示指明整数文字量的类型为unsigned int(U)和long int(L). 类似的还有浮点数文字量的后缀修饰F或f,用于指 ...

  5. 第16章 C预处理器和C库 16.3 在#define中使用参数

    2019独角兽企业重金招聘Python工程师标准>>> 通过使用参数,可以创建外形和作用都与函数相似的类函数宏(function-like macro). 类函数宏的定义中,用圆括号 ...

  6. C语言中#define中的一些特殊用法

    转载自:http://blog.sina.com.cn/s/blog_4a4365030100edq7.html define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方 ...

  7. #define中 #与##的神奇用法

    本文整理自csdn. #define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ) {     puts(d(f(a, ...

  8. #define中宏定义中的空格

    宏定义中的空格 另外还有一个问题需要引起注意,看下面例子: #define SUM (x) (x)+(x) 复制代码 这还是定义的宏函数SUM(x)吗?显然不是.编译器认为这是定义了一个宏:SUM,其 ...

  9. #define中的“\”作用

    在C++中,我们在定义#define宏时是要保持在一行的,而有时候定义内容可能不是很美观,影响阅读,而在这时我们就可以使用 " \ " 强制转行,使编译器仍将换行后认为是同一行,增 ...

最新文章

  1. X-UA-Compatible也无法解决的IE11兼容问题
  2. lodash源码分析之获取数据类型
  3. [原]《Web前端开发修炼之道》-读书笔记CSS部分
  4. 【转】storm 开发系列一 第一个程序
  5. 星尘小组第八周翻译-数据页和数据行
  6. COSCon'18 面向全宇宙招募志愿者啦!
  7. 【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN
  8. zookeeper 和 kafka 集群搭建
  9. 【白皮书分享】2022年私域运营趋势及创业机会.pdf(附下载链接)
  10. 深度解析国内主流离线编程软件
  11. 软件工程专业如何论文选题?
  12. 大学四年软件工程专业的学习经验总结
  13. 数据分析师培训班哪家好?
  14. java 人脸活体检测_人脸识别活体检测测试案例
  15. 头条小程序对接微信、支付宝
  16. realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声...
  17. R语言 多个变量进行 卡方检验 循环 fisher检验 chi test 循环
  18. Python个人博客项目-3.用户应用开发
  19. 端口绑定技术基础介绍
  20. Hashmap如何实现key的唯一性

热门文章

  1. pathon fastapi报错value is not a valid dict (type=type_error.dict)
  2. 12个Java长久占居主要地位的原因
  3. element ui 表格里面放图片
  4. linux下fstat、stat和lstat 区别(转)
  5. 秋月之谋:早评黄金1505空单精准出击,空军在下一城!原油保持观望
  6. 实例1QQ好友列表界面和九宫格
  7. 在CSS中创建径向菜单
  8. 生日快乐的代码_贺渝同学生日快乐!
  9. 了解汽车上的OBD-II接口
  10. zynq 黑金 linux 教程,【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验...