首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句
#ifndef _MYHEADFILE_H
#define _MYHEADFILE_H
// .......语句......
#endif // _MYHEADFILE_H
为了避免同一个文件被include多次,我们常使用 #ifndef 进行判断,如果没有包含
_MYHEADFILE_H , 则使用#define 来定义一个宏 _MYHEADFILE_H
说到这里,我们有必要提一个C语言中的预处理器,预处理器是一个小软件,它可以在编译前处理C程序,它的行为是由预处理指令控制的,预处理指令包含了以下内容:
1,宏定义 #define
2,文件包含 #include
3,条件编译 #if
#ifdef
#ifndef
#if defined
#if !defined
#elif
#else
#endif
#undef
下面我们来看看条件编译
#if (comdition)
{//语句##;}
#endif
如果(comdition)为真, 也就是逻辑1的话,编译下面的语句,如果(comdition)为假,即逻辑0,则不编译下面的语句。例子如下:
#define DEBUG
#if DEBUG
Printf(“Value of i:%d\n”, i);
Printf(“Value of j:%d\n”, j);
#endif
格式:
#if 常量表达式
常量表达式为0时,预处理器删除#if 和#endif中间的代码
#if 会把没有定义过的标准符视做为0, 如果没有定义DEBUG, 则
测试#if DEBUG 会失败,但#if !DEBUG会成功。
可以用宏来定义文件名:
#if define(IA32)
#define CPU_FILE “ia32.h”
#elif defined(IA64)
#deifine CPU_FILE “ia64.h”
#elif defined(AMD64)
#define CPU_FILE “amd64.h”
#endif
#include CPU_FILE
还可以取消已经定义的宏:
#if defined VALUE // 检验VALUE是否被定义 ,如果被定义
#undef VALUE // 解除语句定义
#define VALUE 1000 // 重新定义VALUE 为1000
#endif
如果检验没有定义,可以这样写:
#ifndef VALUE // 如果VALUE没有被定义
#define VALUE 1000 // 定义VALUE 为1000
#endif
以上所用的宏中:
#undef为解除定义;
#ifndef是if not defined的缩写,也可以写成#if !defined 即如果没有定义;
#ifdef是if defined的缩写,也可以写成#if defined 即检查是否定义过;
#ifdef 和 #if defined 的区别,#ifndef 与#if !defined 的区别相类似,都在于后者可以组成复杂的预编译条件,前者只判断单个宏是否定义,例如:
#if defined(PERL_PACK_CAN_SHRIEKSIGN)
/* v */ SIZE16,
#else
0,
#endif
#ifdef PERL_PACK_CAN_SHRIEKSIGN
/* v */ SIZE16,
#else
0,
#endif
#ifdef是种简写,但不支持更复杂的表达式。
#ifdef HAVE_MYHEADER
# if VERSION > 3
...
# endif
#endif
这种情况用
#if defined(HAVE_MYHEADER) && VERSION > 3
...
#endif
更为合理
总结:
#ifdef只能判断单一的宏是否定义,而#if defined()可以组成复杂的判别条件;
对于单一的宏AAA来说,#ifdef AAA和#if defined(AAA)是完全相同的。
而要组成复杂的判别条件,用#if defined()就灵活方便了,比如:#if defined(AAA) && (BBB >= 10)
如果改用#ifdef则没法表示条件BBB>=10了。