12.3.2 #if和#elif预处理程序语句

if预处理程序语句提供控制条件编译的更通用方法。if语句可以用来检测常量表达式是不是非零。如果表达式的结果非零,就会处理到#else、#elif或#endif为止的所有后续行;否则将跳过它们。

举一个如何使用它的例子,Foundation头文件NSString.h中有以下行:


if MAC_OS_X_VERSION_MIN_REQUIRED<MAC_OS_X_VERSION_10_5

define NSMaximumStringLength(INT_MAX-1)

endif


这将预定义变量MAC_OS_X_VERSION_MIN_REQUIRED的值与预定义变量MAC_OS_X_VERSION_10_5的值进行比较。如果前者小于后者,就处理随后的#define,否则就跳过它。如果程序在MAC OS X 10.5或更高版本上编译,这大概将一个字符串的最大长度设置为整型的最大大小减1。

特殊运算符


defined(name)


也能够用在#if语句中。预处理程序语句集


if defined(DEBUG)

……

endif



ifdef DEBUG

……

endif


的作用相同。

以下语句出现在NSObjcRuntime.h头文件中,用于根据使用的特定编译器定义NS_INLINE(如果之前未定义):


if!defined(NS_INLINE)

if defined(GNUC


define NSINLINE static__inline_attribute((always_inline))

elif defined(MWERKS)||defined(__cplusplus)

define NS_INLINE static inline

elif defined(_MSC_VER)

define NS_INLINE static__inline

elif defined(WIN32

define NSINLINE static_inline

endif

endif


if另一种常见用法是在如下代码序列中:


if defined(DEBUG)&&DEBUG

……

endif


这使得#if到#endif之间的语句只有在定义了DEBUG而且具有非零值时才被处理。