目录
前言:
本篇介绍c/c++的预处理过程,c和c++在预处理阶段基本相同。
1. 预定义符号
c语言定义了一些预处理的符号,这些是可以直接使用的,并且这些符号也是在预处理期间完成的。
- __FILE__ //进⾏编译的源⽂件
- __LINE__ //⽂件当前的⾏号
- __DATE__ //⽂件被编译的⽇期
- __TIME__ //⽂件被编译的时间
- __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
2. #define定义常量
例如我们定义100为一个MAX,后面使用MAX都会在预处理阶段替换为100。
#define MAX 100
如果我们觉得定义的东西太长了,也可以分行写,在结尾加上反斜杠\即可:
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ , \
__DATE__,__TIME__ )
现在来考虑一个问题:
在定义常量的时候,要不要加上引号???
#define MAX 1000;
#define MAX 1000
其实通过#define的性质就可以知道,它在预处理阶段做的只是替换工作,如果将代码放到下面的情况下就会出错:
if(condition)
max = MAX;
else
max = 0;
这样if后面就是两条语句了,而由于if如果不加大括号匹配的只有一条语句,所以这样else就没法匹配了,就出错了。
3. #define定义宏
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。
语法为:
#define name( parameter-list ) stuff
注意参数列表的括号必须要与name之间没有空格,不然参数列表就被识别为右边的内容了。
例如我们现在实现一个宏来实现乘法:
#define SQUARE( x ) x * x
可这样能表达我们想要的意思吗???
我们要注意宏仅仅是替换,所以在打印下面的情况下,就会出错:
int a = 5;
printf("%d\n", SQUARE(a + 1));//结果是11
我们想表达的是(5+1)*(5+1),而结果却是11,这就是因为宏仅仅是替换,只是替换为了a+1*a+1,所以我们加上扩号就能达到预期的效果了。
#define SQUARE