预处理:宏定义,文件包含,条件编译
预处理是在编译之前进行
宏定义:#define 宏名 宏值
宏定义:不是说明或语句,不需要加分号;
宏定义的作用域是从定义位置开始到整个程序结束,但可以用 #undef 来终止宏定义的作用域(在终止处加 #undef 宏名)
//宏定义允许嵌套 #define R 5 #define PI 3.14 #define V PI*R*R*R*4/3
//带参数的宏定义:#define 宏名(宏参数) 宏值/参数表达式 #define MAX( x , y ) ((x)>(y)? (x) : (y) ) //每个参数都带括号是为防止不正确输出。例如: #define SQUARE x * x SQUARE(5+1)=5+1*5+1=11 //看似像函数,其实有区别:宏定义不需要指明参数的类型,只是做机械式 的替换
#和##是两个预处理运算符;(用于宏定义)
#:后面跟一个参数,预处理把这个参数转变为一个字符串;
##:连接运算符,将左边和右边的参数连接成字符串;
//宏定义也可以传入可变参数(可空参数): #define SHOWLIST(...) printf(#__VA_ARGS__) #define PRINT( format, ...) printf( format##__VA_ARGS__) PRINT(num=%d\n,250)————结果会输出:num=250
注:宏定义是在预编译阶段替换代码中;不像函数一样每次调用都要去申请栈空间(这个角度说明宏定义效率高)
内联函数(inline):由于函数较宏定义效率低,所以有了内联函数;用关键字( inline )修饰函数;(原理:相当于宏定义展开)
较宏定义的优点:去除了宏定义的不正确输出的风险(编译器会自动判断并修改内联函数)