编译预处理指令
- #开头的是编译处理指令
- 它们不是c语言的成分,但是c语言程序离不开它们
- #define用来定义一个宏
#define
- #define <名字> <值>
- 注意没有结尾的分号,因为不是c的语句
- 名字必须是一个单词,值可以是各种东西
- 在c语言的编译器开始编译之前,编译预处理程序(cpp)会把程序中的名字换成值
- 完全的文本替换
- 如果一个宏的值有其他宏的名字,也是会被替换的
- 如果一个宏的值超过一行,最后一行之前的末行需要加\
- 宏的值后面出现注释不会被当作宏的值的一部分
eg:
没有值的宏
- #define _DEBUG
- 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义了
预定义的宏
- _LINE_ : 源代码中当前所在行的行号
- _FILE_ : 源代码文件的名字
- _DATE_ : 编译时的日期
- _TIME_ : 编译时的时间
- _STDC_ : 当编译器以ANSI 标准编译时,则定义为1,判断该文件是不是标准的c程序。
像函数的宏
- #define cube(x) ((x)*(x)*(x))
- 宏可以带参数
带参数的宏的原则
- 一切都要加括号
整个值要加括号
参数出现的每个地方都要加括号 - #define RADTOPFG(x) ((x)*57.29578)
带参数的宏的
- 可以带多个参数
eg: #define MIN(a,b) ((a)>(b)?(b):(a)) - 也可以组合(嵌套)其他宏
- 在大型程序的代码中使用非常普遍
- 可以非常复杂,如“产生”函数,此时函数效率高,但是比函数占的内存大
- 在#和##这两个运算符的帮助下,做出可以产生新函数的东西
- 部分宏会被inline函数代替
其他编译预处理指令
- 条件编译
- error
- …