1、条件编译用途————调试程序
条件编译在调试中的作用:
· 注销代码
· 开、关调试宏
1)注销代码
(a)使用// /* */来注销代码
使用//、/* */注释代码时,说白了就是告诉“预编译器”把这些代码当做注释来处理。
· 单行注销:使用//来注释
· 多行注销(代码块注销):使用/* */
使用/* */对代码块注释,其实并不是很方便,因为当你打开代码块时需要将/* */都删掉。
特别是当/* */注销的代码特别长时,会很不方便。
(b)使用条件编译来注销代码
· 单句代码的注销还是使用//来注销,因为单句使用//更方便
· 代码块的注销,使用条件编译更方便
例子:
#if 0 //0就是注销(去掉)代码,1就保留代码 int fun(int va) { int a = 100; return a*va; } #endif int main(void) { int ret = 0; #if 0 ret = fun(1000); printf("ret = %d\n", ret); #endif retutn 0; }
2)开、关调试宏
有关调试宏我们在前面就讲过,这里我们使用条件编译来快速的打开和关闭调试宏。
直接代码演示
#include <stdio.h> #ifdef DEBUG1 # define DBG1 printf("%s %d %s\n", __FILE__, __LINE__, __func__); #else # define DBG1 #endif #ifdef DEBUG2 # define DBG2(info1, info2) printf(info1, info2); #else # define DBG2(info1, info2) #endif void exchange(int *p1, int *p2) { DBG1 int tmp = 0; DBG1 tmp = *p1; DBG1 *p1 = *p2; DBG1 *p2 = tmp; DBG1 } int main(void) { int a = 10; int b = 30; DBG2("%s\n", "1111"); DBG1 exchange(&a, &b); DBG1 printf("a=%d, b=%d\n", a, b); DBG1 return 0; }
通过条件编译可以将调试宏快速可打开和关闭,方便快速查看调试结果,等调试完毕后,我们再将程序中的调试宏删掉。
2、条件编译 与 配置文件
有关配置文件我们在第一章其实就介绍过,我们这里再来详细的说说配置文件。
2.1 为什么需要配置文件
当一个c/c++程序非常庞大时,程序中往往会有很多的条件编译,如果全都自己在源码中一个一个的修改相关宏来打开和关闭条件编译的话,这会非常的麻烦,此时就需要用到配置文件来帮我们自动修改相应的宏,以打开和关闭相应的条件编译。
2.2 使用配置文件来打开、关闭条件编译的原理
配置文件其实一个脚本文件。
(1)修改配置文件:通过配置文件来决定,我想定义哪些宏,想删除哪些宏
(2)执行配置文件:生成config.h,配置文件会往config.h中输入各种条件编译需要的宏定义
(3)编译程序:在源码所有.c/.h中包含config.h,预编译时就可以通过config.h中的宏来打开和关闭条件编译了。
2.3 是不是只要程序中有条件编译,就用需要用到配置文件?
当然不是,
(1)什么情况下,我们没必要使用配置文件
1)如果你的条件编译是用来注释代码,以及调试程序用的,这些条件编译完全由我们自己手动定义宏来打开和关闭
2)如果代码很简单,全都是通用代码,根本没有用到任何的条件编译,此时根本不需要配置文件
3)你的C虽然用到条件编译了,但是用的非常少,这样的话我们完全可以自己在源码中手动修改各种宏定义来打开和关闭条件编译,也不需要配置文件。
总之在我们平时的开发中,对于我们自己写的c程序来说,几乎用不到配置文件。
(2)我们什么时候会用到配置文件呢?
1)如果你或者你的团队编写的C工程项目非常复杂,里面涉及大量的条件编译,此时就需要用到配置文件。
不过这种情况很少见,真的遇到时,那就需要我们自己写配置文件了。
2)下载移植官方c/c++源码时,源码一定会提供配置文件
比如我们后面移植uboot和Linux内核,uboot和Linux内核的代码不可能我们自己写,所以必须到官网去下载官方提供源码,然后修改源码并编译它。
但是官方c源码非常复杂,为了实现跨平台,里面有大量的条件编译,我们不可能读懂所有源码,然后直接在源码中去修改宏,然后打开和关闭相应的条件编译,对于像Linux内核这种非常庞大的C源码来说,根本不可能。
所以官方一定会提供配置文件给我们,我们直接修改配置文件即可,不需要阅读源码,就算阅读源码,也只需要阅读关键部分的源码即可。
对于复杂的Linux内核来说,官方还提供了更加人性化的配置文件修改方式。
那就是我们可以通过图形化的界面去修改配置文件。
不过对于大多数的配置文件来说,我们都是直接打开文件,然后直接修改。
所以其实在实际开发中,我们更多的是去阅读和修改已有的配置文件,而不是制作配置文件。