#ifdef #if defined #ifndef和#if !
首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句
#ifndef _MYHEADFILE_H
#define _MYHEADFILE_H
// .......语句......
#endif // _MYHEADFILE_H
为了避免同一个文件被include多次,我们常使用 #ifndef 进行判断,如果没有包含
_MYHEADFILE_H , 则使用#define 来定义一个宏 _MYHEADFILE_H , #endif 与#ifndef
首尾呼应,表示结束。
#ifdef
#ifndef
#if defined
#if !defined
#ifdef只能判断单一的宏是否定义,而#if defined()可以组成复杂的判别条件;
对于单一的宏AAA来说,#ifdef AAA和#if defined(AAA)是完全相同的。
而要组成复杂的判别条件,用#if defined()就灵活方便了,比如:#if defined(AAA) && (BBB >= 10)
如果改用#ifdef则没法表示条件BBB>=10了。
宏定义 #define
指令都是以#开始的,我们来看一下简单的宏定义(对象式宏)
#define 标准符 替换列表
#define PI 3.1415926
可以对类型重命名,如: #define BOOL int
宏可以带参数,也是常说的宏函数
#define 标识符(x1,x2...) 替换列表
特别注意的是标识符和(之间不能有空格,圆括号是必须的。
我们来看一下例子:
#define MAX(x,y) ((x)>(y)?(x):(y))
#define IS_EVEN(n) ((n)%2==0)
格式:
#if ...
#elif...
#elif...
#endif...
举例:
#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
还可以取消已经定义的宏:用undef
#if defined VALUE // 检验VALUE是否被定义 ,如果被定义
#undef VALUE // 解除语句定义
#define VALUE 1000 // 重新定义VALUE 为1000
#endif