一. 预处理详解
1.1 预定义符号
FILE //进行编译的源文件
LINE //文件当前的行号
DATE //文件被编译的日期
TIME //文件被编译的时间
FUNCTION //文件当前所在的函数
STDC //如果编译器遵循ANSI C标准,其值为1,否则未定义
这些预定义符号都是语言内置的
我们来使用下上面的语句
这样我们就可以知道 函数在什么时间 什么地点 发生了什么
1.2 #define 定义标识符号
define可以定义符号
例如
#define MAX 1000 int main() { int m = MAX; //int m = 1000; printf("%d\n", m); return 0; }
在预处理时其实MAX就变成了1000
这里注意的是define是不能加分号的 否则替换到源文件里面会出现各种问题
1.3 #define 定义宏
我们举个例子
#define SQUARE(x) (x)*(x) int main() { printf("%d\n", SQUARE(5 + 1));//不要吝啬括号,不加括号有时候可能导致优先级的错误 printf("%lf\n", SQUARE(5.0));//宏定义不限制类型 return 0; }
这里 它就是一个宏 它允许把参数替换到文本中去 这种实现通常称为宏
我们在定义宏的时候一定要注意括号
#define DOUBLE(x) ((x)+(x)) int main() { printf("%d\n", 10 * DOUBLE(3));//最好能把整体也加上括号 return 0; }
这题如果不在宏定义时加上整体的一个大括号就会导致输出结果的错误 计算成33
但实际上我们的要求是60
这里还有要注意的一点 注释中的宏是不会被替换的
1.4 #define 的副作用
我们写出以下代码
#define Max(x,y)((x)>(y))?(x):(y) int main() { int a = 5; int b = 8; int c= Max(a++, b++); printf("%d\n", a); printf("%d\n", b); printf("%d\n", c); return 0; }
这里输出结果如下
我们可以发现 其实b是++了两次的
这里就是宏的一个小缺陷
1.5 宏和函数对比
宏通常用于比较简单的运算
例如求两个数中的较大值
为什么这样子呢?
因为
1 宏在规模和速度方面更胜一筹
2 函数必须要声明类型 而宏不用
当然宏也有缺点
- 每次使用宏的时候一份宏的代码将会被插入到程序中 除非宏比较短 可能大幅度增加程序的长度
- 宏无法调试
- 宏无类型定义 不够眼睛
- 宏可能会带来操作符优先级的问题 导致程序出错
以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言