本文综合参考http://blog.csdn.net/raining_heart/article/details/8019535和http://quanminchaoren.iteye.com/blog/1870977两篇文章,非常感谢原文作者!
最近在看MTK源代码,发现里面很多#if 0...#endif #if defined()...#endif #ifdef...#endif #ifndef...#endif
#if !defined()...#endif ,下面逐个来讨论。
1、#if 0...#endif
#if 0...#endif的作用与注释是一样的,有些人说使用#if 0...#endif可以进行嵌套注释,在平时使用注释时是不能进行嵌套注释的
#include“stdio.h”
int main()
{
int a=11;
a++;
*/
}
这段代码的注释是有问题的,因为注释符头 " / * "是根据最近结束符 " */ "来判断注释的区域的,但是一但内嵌了就会发现错误。所以人们就使用了#if 0,如下:
#include“stdio.h”
int main()
{
int a=11;
}
但是,#if就只有这个作用吗?有些书籍呼吁人们尽量少用它,那不是没有什么意义了?
其实不是的,在有些地方很常见到它,而且少不了它。当你见识过系统级的源代码就焕然大悟了。对,就是用于系统裁剪。系统裁剪是针对系统的用途,对系统的源代码进行一下优化,减少不必要的功能。
#if是一个最经典的例子。如:
#include“stdio.h”
#define TEST_2 1
int main()
{
int a=11;
}
如上面的例子,对于某些功能不需要,我们只需对于的功能TEST_2的宏定义改成0,然后重新编译就行了。当然一般宏定义是放在一个特定的文件(这里为了简单就写在一起),这样外面的人只需要更改那个文件所对应的值就行对系统进行裁剪而不需要关心具体代码,就行实现裁剪。
除了0之外,if后面也可以接其它的
#if (MAX==10)||(MAX==20)
code...
#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)
2、#if defined()...#endif 等的用法
#if后面接的是一个宏。
#if defined (x)
...code...
#endif
这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则不直接忽视中间的…code…代码。
另外 #if defined(x)也可以取反,也就用 #if !defined(x)
#ifdef的使用
#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。
最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif