?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
預處理器支持條件編譯源文件的各個部分。此行為是由控制#if
,#else
,#elif
,#ifdef
,#ifndef
和#endif
指令。
#if expression | ||
---|---|---|
#ifdef expression | ||
#ifndef expression | ||
#elif expression | ||
#else | ||
#endif |
條件預處理塊開頭#if
,#ifdef
或#ifndef
指令,則可選地包括任意數(shù)量的#elif
指示,那么可任選地包括至多一個#else
指令,并終止與所述#endif
指令。任何內(nèi)部條件預處理塊都是分開處理的。
每個的#if
,#elif
,#else
,#ifdef
和#ifndef
指令控制一個代碼塊,直到第一#elif
,#else
,#endif
指令不屬于任何內(nèi)條件預處理塊。
#if
,#ifdef
和#ifndef
指令測試指定的條件(見下文),如果它的計算結(jié)果為 true,則編譯受控代碼塊。在這種情況下,后續(xù)#else
和#elif
指令被忽略。否則,如果指定的條件評估為 false,則會跳過受控代碼塊并處理后續(xù)#else
或#elif
指令(如果有)。在前一種情況下,由#else
指令控制的代碼塊被無條件編譯。在后一種情況下,#elif
指令的行為就好像它是一個#if
指令:檢查條件,根據(jù)結(jié)果編譯或跳過受控代碼塊,在后一種情況下處理后續(xù)指令#elif
和#else
指令。條件預處理塊由#endif
指示。
#if, #elif
表達式是一個常量表達式,僅使用文字和標識符,使用#define
偽指令定義 。任何標識符(不是字面值,使用#define
指令未定義 )都會計為0。
表達式可以包含表單defined
標識符或defined (
標識符中的一元運算符)
,1
如果標識符是使用#define
偽指令定義的,則返回標識符 ,否則返回0 如果表達式計算為非零值,則包含受控代碼塊并以其他方式跳過。如果任何使用的標識符不是一個常量,它將被替換為0
。
注意:#if cond1 ... #elif cond2 不同于 #if cond1 ...#else 然后是 #if cond3,因為如果cond1 為 true,則會跳過第二個 #if,并且 cond3 不需要格式良好,而#elif 的 cond2 必須是有效的表達式。 | (直到C11) |
---|
#ifdef, #ifndef
檢查標識符是否使用#define
偽指令定義 。
#ifdef
標識符實質(zhì)上等同于#if defined(
標識符)
。
#ifndef
標識符實質(zhì)上等同于#if !defined(
標識符)
。
#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標準(ISO / IEC 9899:2011):
6.10.1有條件包含(p:162-164)
C99標準(ISO / IEC 9899:1999):
6.10.1有條件包含(p:147-149)
C89 / C90標準(ISO / IEC 9899:1990):
3.8.1有條件包含