18.4 条件编译

18.4.1 #if 0…#endif的用途

  #if 0 ... #endif的作用和/*...*/的作用是一样的,就是注释!

  可是为什么不用注释符号/*?

  答:为了解决嵌套注释。例子如下:

#include“stdio.h”
int main()
{   
int a=11;   /*这是一个外层注释 /* int *b=&a; //这是一个内层代码注释 *b = 10; */
  a++; */ }

上面的程序编译后发现缺少了一个注释符号,因为注释符头 " / *  "是根据最近结束符 " */  "来判断注释的区域的,但是一但内嵌了就会发现错误。所以就使用了#if 0。如下:

#include“stdio.h”
int main()
{   
int a=11/*这是一个外层注释 #if 0   int *b=&a; //这是一个内层代码注释 *b = 10; #endif a++; */ }

在有些地方很常见到它,而且少不了它。当你见识过Linux系统的源代码就明白了。

#if 0…endif主要用于系统裁剪。

系统裁剪是针对系统的用途,对系统的源代码进行一下优化,减少不必要的功能。

#include“stdio.h”
#define TEST    1
int main()
{   
int a=11/*这是一个外层注释 #if TEST int *b=&a; *b = 10; #endif a++; */ }

如上面的例子,对于某些功能不需要,我们只需对于的功能TEST的宏定义改成0,然后重新编译就行了。当然一般宏定义是放在一个特定的.h文件里,这样只需要更改那个文件所对应的值就可以对系统进行裁剪而不需要关心具体代码。

18.4.2 #ifndef、#define、#endif的用途

  看到很多程序的头文件写:

  #ifndef HeaderName_h

  #define HeaderName_h

    //这里面通常写各种宏定义、其他头文件的包含

  #endif

  这样做的目的:防止该头文件被重复引用。

  什么是“头文件被重复引用”?

  答:其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。

  比如:存在a.h文件#include "c.h",而b.cpp文件同时#include "a.h" 和#include "c.h",此时就会造成c.h被b.cpp重复引用。

  头文件被重复引用引起的后果:

  有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些。但是有些头文件重复包含,则会引起错误,比如:在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的),这种头文件重复包含会引起全局变量的重复定义


原文地址:https://www.cnblogs.com/baixu/p/10392155.html