预处理 讲解
一.预定义符号
提前定义好的,可以直接使用的符号!(这让我想到了库函数是什么?库函数就是提前定义好的,可随时使用的函数)
- _ _FILE_ _ //进行编译的原文件
- _ _LINE_ _ //文件当前的行号
- _ _DATE_ _ //文件被编译的日期
- _ _TIME_ _ //文件被编译的时间
- _ _STDC_ _ //如果编译器遵循ANSIC,则值为1,否则未定义
二.#define定义常量/符号
#define MAX 100 //后面出现MAX的地方都会被替换成100
#define forever for( ; ; ) //这个会陷入死循环,因为for循环少了判断部分,会死循环
#define CASE break;case //在写case语句的时候自动把break写上
举例说明:
问题:#define定义标识符的时候,要不要加上分号 ; 呢?
不需要,有点多余,因为替换过去可能也会带上分号一起
三.#define定义宏
宏与常量的区别在于 宏是有参数的
#define name(参数部分) stuff
简单来说: #define 宏名称(宏参数) 宏内容
注意!这里的name和参数部分之间不能有空格!!如果有空格,那就会被当成是#define 定义的常量了,name被当成常量/符号,参数部分被当成常量内容/符号内容
举例说明:
重点!宏的参数是不会计算,是会直接替换进去的!!
举例说明:
结果并不是我们想要的6*6=36 而是5+1*5+1 =11
解决办法:加括号
宏在书写的时候,不要吝啬括号!!!
四.带有副作用的宏参数
先自己思考一下下面的代码,得出结果:
#include<stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))int main()
{int a = 3;int b = 5;int m = MAX(a++, b++);printf("%d\n", m);printf("%d\n", a);printf("%d\n", b);return 0;
}
解析:
五. #运算符
六.命名约定
建议:宏名大写,函数名不要大写
七.#undef 移除一个命令
八.预处理指令
举例:#include #define .........