1.编译预处理指令
# 开头的是编译预处理指令(其他语言也可使用,include 不是 C 语言关键字)。
它们不是 C 语言的成分,但是 C 语言离不开它们。
#define 用来定义一个宏
#define <名字> <值> 注意没有结尾的分号,因为不是 C 的语句。#define PI 3.14159
名字必须是一个单词,值可以是各种东西。
在 C 语言的编辑器开始编译之前,编译预处理程序(cpp)会把程序中的名字换成值。完全的文本替换。
2.宏
如果一个宏的值中有其他的宏的名字,也是会被替换的;
如果一个宏的值超过一行,最后一行之前的行末需要加 \ ;
宏的值后面出现的注释不会被当作宏的值的一部分(空格、其他的标点符号都会被当作是宏定义的一部分)。
没有值的宏
#define _DEBUG
这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否被定义过了。
存在编译一部分代码,不存在编译另一部分代码。
预定义的宏
表达特殊东西,让编译器替你插入特殊的值。
__LINE__ 源代码文件的行号,当前所在行号
__FILE__ 源代码文件的文件名
__DATE__ 编译时的日期
__TIME__ 编译时的时间
__STDC__ 当要求程序严格遵循 ANSIC 标准时,该标识符被赋值为 1 。
3.带参数的宏
#define cube(x) ((x)*(x)*(x)) 宏可以带参数
带参数的宏的原则: 一切都要括号
整个值都要括号,参数出现的每个地方都要括号。
可以带多个参数 #define MIN(a,b) ((a)>(b)?(b):(a)) 也可以组合(嵌套)使用其他宏。
在大型程序的代码中,带参数的宏使用非常普遍,代替函数运行运行效率高。
部分宏会被 inline 函数取代。