#ifndef详解
#ifndef 是"if not defined"的简写,是预处理功能(宏定义、文件包含、条件编译)当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是:
1、防止头文件的重复包含和编译;
还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你最好都加上这个。一般格式是这样的:
#ifndef <标识>
#define <标识>
......
......
#endif
<标识>在理论上来说是可以自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的明明规则一般是头文件名全大写,前面加下划线,并把文件名中的"."也变成下划线,如:stdio.h
#ifndef _STDIO_H
#define _STDIO_H
......
......
#endif
注意:#ifndef起到的效果是防止一个源文件多次包含同一个头文件,而不是防止两个源文件包含同一个头文件。事实上,防止同一头文件被两个不同的源文件包含这种要求本身就是不合理的,头文件存在的价值就是被不同的源文件包含。
2、便于程序的调试和移植;
1)
#ifndef 标识符
程序段 1
#else
程序段 2
#endif
它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。
2)
#ifndef 标识符
#define 标识符
程序段 1
#else
程序段 2
#endif
它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。
3)
#if 表达式
程序段 1
#else
程序段 2
#endif
它的作用是当“表达式”值为真时,编译“程序段1”,否则编译“程序段2”。
注:以上三种形式中#else不是强制的,可省略;当然,当#else后需要嵌套#if时,可以使用预处理命令#elif,它相当于#else#if。
小结:在程序中使用条件编译主要是为了方便程序的调试和移植。