#if
#if和#endif是一組同時(shí)使用的映之,叫做條件編譯指令便锨。#if與#define歪架、#include等指令一樣是由預(yù)處理器這個(gè)強(qiáng)大的工具處理的矫夷,預(yù)處理器可以在編譯前處理c程序葛闷。
使用條件編譯指令,如果滿(mǎn)足#if后面的條件双藕,就編譯#if和#endif之間的程序段淑趾,否則不編譯。
例如
#define LEN_MAX 3
#define LenMax 6
#if LEN_MAX <LenMax
#undef LEN_MAX
#define LEN_MAX LenMax
#endif
定義了LEN_MAX 和LenMax忧陪,如果LEN_MAX <LenMax成立為真扣泊,則取消LEN_MAX的定義,重新定義LEN_MAX嘶摊,也就是說(shuō)LEN_MAX等于6延蟹。這時(shí)預(yù)處理器會(huì)保留中間程序(#if與#endif行會(huì)消失),讓編譯器編譯中間行叶堆。
如果LEN_MAX <LenMax不成立阱飘,預(yù)處理器會(huì)將刪除#if到#endif中的程序(包括#if與#endif行),則編譯器會(huì)看不到中間的程序。
這樣的處理不會(huì)在目標(biāo)代碼中占用空間沥匈,減少程序運(yùn)行時(shí)間果录。它可以用于程序調(diào)試使用。
#if vs. if
條件編譯是C語(yǔ)言中預(yù)處理部分的內(nèi)容咐熙,它是編譯器編譯代碼時(shí)最先處理的部分弱恒,
條件編譯里面有判斷語(yǔ)句,比如 #if 棋恼、#else 返弹、#elif 及 #endif
它的意思是如果宏條件符合,編譯器就編譯這段代碼爪飘,否則义起,編譯器就忽略這段代碼而不編譯,如
#define A 0 //把A定義為0
#if (A > 1)
printf("A > 1"); //編譯器沒(méi)有編譯該語(yǔ)句,該語(yǔ)句不生成匯編代碼
#elif (A == 1)
printf("A == 1"); //編譯器沒(méi)有編譯該語(yǔ)句,該語(yǔ)句不生成匯編代碼
#else
printf("A < 1"); //編譯器編譯了這段代碼师崎,且生成了匯編代碼默终,執(zhí)行該語(yǔ)句
#endif
而 if 語(yǔ)句則不然,if 是 C 語(yǔ)言中的關(guān)鍵字犁罩,它根據(jù)表達(dá)式的計(jì)算結(jié)果來(lái)覺(jué)定執(zhí)行那個(gè)語(yǔ)句齐蔽,它里面的每個(gè)分支都編譯了的, 如
#define A 0
if (A > 1)
printf("A > 1"); //編譯器編譯該語(yǔ)句,但因?yàn)锳 == 0 未執(zhí)行
else if(A == 1)
printf("A == 1"); //編譯器編譯該語(yǔ)句床估,但因?yàn)锳 == 0 未執(zhí)行
else
printf("A < 1"); //編譯器編譯該語(yǔ)句含滴,因?yàn)锳 == 0 故執(zhí)行
#if作為一個(gè)編譯“開(kāi)關(guān)”,比如:
#if(條件滿(mǎn)足)
執(zhí)行代碼1
#else
執(zhí)行代碼2
#endif
條件編譯是根據(jù) 宏條件 選擇性地編譯語(yǔ)句丐巫,它是編譯器在編譯代碼時(shí)完成的谈况;
條件語(yǔ)句是根據(jù)條件表達(dá)式選擇性地執(zhí)行語(yǔ)句,它是在程序運(yùn)行時(shí)進(jìn)行的递胧。