预处理指令就是在代码翻译成01前执行的指令。 所有的预处理指令都是以 # 靠头 预处理指令的作用域,从编写指令一行开始,到文件结束。 1、宏定义 #define 宏名 值 宏名一般用大写。 #defineCOUNT 10 宏在双引号中是不会执行的。
宏也可以定义在函数内部,但是要注意作用域问题。
让宏失效#undef 宏名 代表宏从这行开始失效。
2、带参数的宏 带参数的宏类似于函数,但它比函数更高效 下面是宏的使用
int num1 = 10; int num2 = 3; 下面,程序在编译成0,1时会把sum(num1, num2)替换为num1 + num2 int he = sum(num1, num2); //运行结果为3
一个注意点 int value = sum(2,3) * sun (4, 5); 结果为19,因为宏只是替换你得代码,上面的代码替换后就变成2+ 3 * 4 + 5 所以这里要注意。
如果实在想这样运算,向下面那样定义 #define sum2(v1, v2) (v1 + v2) //把值用括号括起来。 int value2 = sum2(2,3) * sum(4,5); 结果是45
其实上面定义还是不够严谨 比如 #definepingfang(a) (a * a) int value3 = pingfang(2+ 2)/sum(2); 我们想得到的结果是4,但是实际结果是2因为替换后变成 2 + 2 * 2 + 2 == 8 8 / 4 == 2
所以最严谨的是把每个参数都加上括号 #definepingfang2(a) ((a) * (a)) 带参数的宏运行效率比函数高。
3、条件编译 条件编译判断的条件是宏的值。 所以首先要先定义宏,然后在在函数中添加条件编译。
共有3个条件编译 第一个 #if 条件 ...code.. #elif 条件2 ...code.. #else ...code.. #endif
第二个 #ifdef 宏名 ...code... #endif
第三个 #ifndef 宏名 ...code... #endif
演示 #include <stdio.h>
#define NUM 10
int main() { int a = 5; //普通的判断语句,最终会全部参加编译 if (a == 5) { printf("a的值是5\n"); }else if(a == 9){ printf("a的值是9\n"); }else{ printf("a是其他值\n"); } //条件编译语句,在编译前会把符合上面宏定义的值的语句编译到.o文件中。 #if(NUM == 10) //#if printf("NUM的值是10\n"); #elif(NUM == 4) //注意是#elif不是 else if printf("NUM的值是4\n"); #else //#else printf("NUM是其他值\n"); #endif //注意必须要有#endif,不加#endif,会把条件成立后面的语句全部删掉。无法编译成功。
//其他的条件编译指令 //#indef #ifdefNUM printf("如果定义了宏NUM 就编译这一句\n"); #endif
// #ifndefNUM printf("如果没定义宏NUM 就编译这一句\n"); #endif return 0; } //条件编译普通条件判断语句效率高。
4、 #include
1、虽然函数声明可以重复定义,但是会影响编译效率,所以这里有个技巧。在函数的.h文件中加入 #ifndefABC #defineABC int sum(int a, int b); #endif 先判断如果没定义宏ABC,就把条件编译语句中的代码留下。 如果#include了多个这个.h文件,由于这个条件编译,函数声明只会留下一次。 注意:多个函数的.h文件中定义的宏名不能一样,如果一样,编译时就会只留下一个函数声明。所以最好以文件名的大写为宏名。比如JIAFA_H |