__FILE__ //当前文件的文件名
__LINE__ //文件当前的符号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
这些预定义的符号都是语言内置的
举个栗子:
printf("line:%d date:%s\n",__LINE__,__DATE__);
可以发现我们没有定义这些符号,但它们可以被直接使用。
语法:
#define name stuff
举个栗子:
#define MAX 1000 //定义一个标识符常量
#define reg register //将关键字register简化为reg
#define do_forever for(;;) //用更形象的方式来替换一种实现
#define CASE break;case //在写case语句时自动把break自动加上
#define DEBUG_PRINT printf("file:%s line:%d \
date:%s time:%s\n",__FILE__,__LINE__,__DATE__,\
__TIME__); //在stuff定义的过长的时候,可以分成几行写,除最后
//一行外,每行的后面都加一个\(续行符)
那define定义的时候后面要不要加一个分号“ ;”呢?
#define MAX 100;
建议不要,因为这样容易导致问题
比如:
int max=MAX;
这样替换后就会出现语法错误
2.2 #define定义宏#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常为宏或定义宏
#define name(parament-list) stuff
其中的paramen-list是一个由逗号隔开的符号表,它们可能出现在stuff中
注意:
参数列表的左括号必须与name紧邻
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分
举个栗子
#define SQUARE(x) x*x
int a=6;
printf("%d\n",SQUARE(a+1))
乍一看,是不是觉得要打印49?
但事实上,它打印12
因为#define在预处理时会被替换文本,参数x被成a+1,那实际上语句就为
printf("%d\n",a+1*a+1);
所以在进行宏定义时,要想得到想要的结果,要加上括号
#define SQUARE(x) ((x)*(x))
2.3 #define的替换规则
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
1.在调用宏时,首先对参数进行检查,看看是否包括任何#define定义的符号。
如果有,它们首先会被替换。
2.在替换文本随后被插入到程序中原本文本的位置。
对于宏,参数名被它们的值替换。
3.最后,再次对结果文件进行扫描,看看它是否包括任何由#define定义的符号,如果是,就重复上述过程。
要注意的是:
1.宏参数和#define定义中可以出现其他#define定义的符号,但对于宏,不能出现递归。
2.当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)