這種能夠根據(jù)不同情況編譯不同代碼、產(chǎn)生不同目標文件的機制,稱為條件編譯。條件編譯是預(yù)處理程序的功能,不是編譯器的功能。
條件編譯有多種形式,下面一一講解。
#if 命令
#if 命令的完整格式為:
#if 整型常量表達式1
程序段1
#elseif 整型常量表達式2
程序段2
#elseif 整型常量表達式3
程序段3
#else
程序段4
#endif
它的意思是:如常“表達式1”的值為真(非0),就對“程序段1”進行編譯,否則就計算“表達式2”,結(jié)果為真的話就對“程序段2”進行編譯,為假的話就繼續(xù)往下匹配,直到遇到值為真的表達式,或者遇到 #else。這一點和 if else 非常類似。
需要注意的是,#if 命令要求判斷條件為“整型常量表達式”,也就是說,表達式中不能包含變量,而且結(jié)果必須是整數(shù);而 if 后面的表達式?jīng)]有限制,只要符合語法就行。這是 #if 和 if 的一個重要區(qū)別。
#elseif 和 #else 也可以省略,如下所示:
#if __FB_WIN32__
print "This is Windows!\n"
#else
print("Unknown platform!\n"
#endif
#if __FB_LINUX__
printf("This is Linux!\n");
#endif
#ifdef 命令
#ifdef 命令的格式為:
#ifdef 宏名
程序段1
#else
程序段2
#endif
它的意思是,如果當前的宏已被定義過,則對“程序段1”進行編譯,否則對“程序段2”進行編譯。
也可以省略 #else:
#ifdef 宏名
程序段
#endif
#ifdef __fb_debug__
print "正在使用 Debug 模式編譯程序..."
#else
print"正在使用 Release 模式編譯程序..."
#endif
當以 Debug 模式編譯程序時,宏 _DEBUG 會被定義,預(yù)處器會保留第 5 行代碼,刪除第 7 行代碼。反之會刪除第 5 行,保留第 7 行。
#ifndef 命令
#ifndef 命令的格式為:
#ifndef 宏名
程序段1
#else
程序段2
#endif
與 #ifdef 相比,僅僅是將 #ifdef 改為了 #ifndef。它的意思是,如果當前的宏未被定義,則對“程序段1”進行編譯,否則對“程序段2”進行編譯,這與 #ifdef 的功能正好相反。
區(qū)別
最后需要注意的是,#if 后面跟的是“整型常量表達式”,而 #ifdef 和 #ifndef 后面跟的只能是一個宏名,不能是其他的。
例如,下面的形式只能用于 #if:
#define NUM 10
#if NUM = 10 or NUM = 20
print "NUM: " & NUM
#else
print "NUM Error"
#EndIf
運行結(jié)果:
NUM: 10
再如,兩個宏都存在時編譯代碼A,否則編譯代碼B:
#define NUM1 10
#define NUM2 20
#if Defined(NUM1) And Defined(NUM2)
Print "NUM1:" & NUM1 & Chr(10) & "NUM2: "& NUM2
#else
print "Error"
#EndIf
sleep
運行結(jié)果:
NUM1: 10, NUM2: 20
#ifdef 可以認為是 #if defined 的縮寫。