条件编译命令对程序的内容进行选择性的编译,可以根据条件选择是否进行编译
#ifndef和#endif
Ifndef == if not define
#ifdef x //x是否定义,如果被定义返回假,没有定义则返回真
#ifndef x //先检测是否宏定义过x
#define x //如果没有宏定义过x,定义x
语句块1
#endif
语句块2
根据是否定义变量X进行分支选择
#ifndef(条件指示符):防止头文件的重复包含和编译
条件编译可以利用条件语句进行实现为什么不用:条件语句对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译只进行编译其中程序的语句块1或者语句块2,生成的目标代码程序较短。
在程序中,假如有两个C文件都包含include用一个头文件,在编译时,这两个C文件要一同编译成一个可运行文件,会出现大量的声明冲突,这时候将头文件的内容都放在#ifndef和#endif中,不管有多少个C文件去引用这个头文件,声明也不会发生冲突。
#ifndef <标识>
#define <标识>
…………
#endif
头文件的标识都是唯一的,标识的命名规则是:头文件名全部大写,前面加下划线,文件名中的(.)也变成下划线;如:stdio.h ——_STDIO_H
C和C++的不同:
在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用# ifndef宏定义,一个c文件多次包含同一个h文件也不会报错
但是在c++语言中,#ifndef的作用域只是在单个文件中。所以如果h文件里定义了全局变量,即使采用#ifndef宏定义,一个c文件包含同一个h文件多次还是会出现全局变量重定义的错误。
使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错误。
条件编译的用法:
1、#ifndef 标识符
程序块1
#else
程序块2
#endif
定义了编译程序块2,没有定义编译程序块1;程序块2有时候可以省略
2、#ifndef 标识符
#define 标识符
程序块1
#else
程序块2
#endif
3、#if 表达式
程序块1
#else
程序块2
#endif
表达式为真,编译程序段1,否则编译程序段2
4、#if defined (x)
code
# endif
程序中不管x的真假只要定义了x则执行code,否则则不执行