黑马程序员技术交流社区
标题: C语言学籍笔记10 [打印本页]
作者: 布鲁兹老爷 时间: 2015-10-14 01:17
标题: C语言学籍笔记10
预处理指令就是在代码翻译成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
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |