?
? ????? PHP ??? ???? ??? ?? ??
預(yù)處理器支持條件編譯源文件的各個(gè)部分。此行為是由控制#if
,#else
,#elif
,#ifdef
,#ifndef
和#endif
指令。
#if expression | ||
---|---|---|
#ifdef expression | ||
#ifndef expression | ||
#elif expression | ||
#else | ||
#endif |
條件預(yù)處理塊開頭#if
,#ifdef
或#ifndef
指令,則可選地包括任意數(shù)量的#elif
指示,那么可任選地包括至多一個(gè)#else
指令,并終止與所述#endif
指令。任何內(nèi)部條件預(yù)處理塊都是分開處理的。
每個(gè)的#if
,#elif
,#else
,#ifdef
和#ifndef
指令控制一個(gè)代碼塊,直到第一#elif
,#else
,#endif
指令不屬于任何內(nèi)條件預(yù)處理塊。
#if
,#ifdef
和#ifndef
指令測(cè)試指定的條件(見下文),如果它的計(jì)算結(jié)果為true,則編譯受控代碼塊。在這種情況下,后續(xù)#else
和#elif
指令被忽略。否則,如果指定的條件評(píng)估為false,則會(huì)跳過受控代碼塊并處理后續(xù)#else
或#elif
指令(如果有)。在前一種情況下,由#else
指令控制的代碼塊被無條件編譯。在后一種情況下,#elif
指令的行為就好像它是一個(gè)#if
指令:檢查條件,根據(jù)結(jié)果編譯或跳過受控代碼塊,在后一種情況下處理后續(xù)指令#elif
和#else
指令。條件預(yù)處理塊由#endif
指示。
#if, #elif
該表達(dá)式是一個(gè)常量表達(dá)式,僅使用文字和標(biāo)識(shí)符,使用#define
偽指令定義 。任何標(biāo)識(shí)符(不是字面值,使用#define
指令未定義 )都會(huì)計(jì)為0。
表達(dá)式可以包含表單defined
標(biāo)識(shí)符或defined (
標(biāo)識(shí)符中的一元運(yùn)算符)
,1
如果標(biāo)識(shí)符是使用#define
偽指令定義的,則返回標(biāo)識(shí)符 ,否則返回0 如果表達(dá)式計(jì)算為非零值,則包含受控代碼塊并以其他方式跳過。如果任何使用的標(biāo)識(shí)符不是一個(gè)常量,它將被替換為0
。
注意:#if cond1 ... #elif cond2不同于#if cond1 ...#else然后是#if cond3,因?yàn)槿绻鹀ond1為true,則會(huì)跳過第二個(gè)#if,并且cond3不需要格式良好,而#elif的cond2必須是有效的表達(dá)式。 | (直到C11) |
---|
#ifdef, #ifndef
檢查標(biāo)識(shí)符是否使用#define
偽指令定義 。
#ifdef
標(biāo)識(shí)符實(shí)質(zhì)上等同于#if defined(
標(biāo)識(shí)符)
。
#ifndef
標(biāo)識(shí)符實(shí)質(zhì)上等同于#if !defined(
標(biāo)識(shí)符)
。
#define ABCD 2#include <stdio.h> int main(void){ #ifdef ABCD printf("1: yes\n");#else printf("1: no\n");#endif #ifndef ABCD printf("2: no1\n");#elif ABCD == 2 printf("2: yes\n");#else printf("2: no2\n");#endif #if !defined(DCBA) && (ABCD < 2*4-3) printf("3: yes\n");#endif}
輸出:
1: yes2: yes3: yes
C11 standard (ISO/IEC 9899:2011):
6.10.1 Conditional inclusion (p: 162-164)
C99 standard (ISO/IEC 9899:1999):
6.10.1 Conditional inclusion (p: 147-149)
C89/C90 standard (ISO/IEC 9899:1990):
3.8.1 Conditional inclusion