關於條件編譯 if等的理解

2021-09-12 22:34:04 字數 2681 閱讀 3852

條件編譯是c語言中預處理部分的內容,它是編譯器編譯**時最先處理的部分,

之所以能夠實現條件編譯是因為預編譯指令是在編譯之前進行處理的,通過預編譯進行巨集替換、條件選擇**段,然後生成最後的待編譯**,最後進行編譯。

#if的一般含義是,如果#if後面的常量表示式為true,則編譯它所控制的**,如條件1成立時就**段1,條件1不成立再看條件2是否成立,如果條件2成立則編譯**段2,否則再依次類推判斷其它條件,如果條件1-n都不成力則會編譯最後的**段n+1.

條件編譯裡面有判斷語句,比如 #if 、#else 、#elif 及 #endif

它的意思是如果巨集條件符合,編譯器就編譯(預處理)這段**,否則,編譯器就忽略這段**而不編譯,如

#define a 0 //把a定義為0

#if (a > 1)

printf("a > 1"); //編譯器沒有編譯該語句,該語句不生成彙編**

#elif (a == 1)

printf("a == 1"); //編譯器沒有編譯該語句,該語句不生成彙編**

#else

printf("a < 1"); //編譯器編譯了這段**,且生成了彙編**,執行該語句

#endif

而 if 語句則不然,if 是 c 語言中的關鍵字,它根據表示式的計算結果來決定執行(執行可不是條件編譯預處理,)那個語句,但是它裡面的每個分支都編譯(都進行了預處理和編譯)了的, 如

#define a 0

if (a > 1)

printf("a > 1"); //編譯器編譯該語句,但因為a == 0 未執行

else if(a == 1)

printf("a == 1"); //編譯器編譯該語句,但因為a == 0 未執行

else

printf("a < 1"); //編譯器編譯該語句,因為a == 0 故執行

#if條件編譯作為乙個編譯「開關」(常用來注釋**),比如:

#if(條件滿足)

執行**1

#else

執行**2

#endif

假如編譯時,確實滿足條件(結果非0時),則生成的程式檔案(.exe檔案)中不會有執行**2的。如果用普通if語句,生成的程式檔案就會有執行**2,這個區別看看生成檔案大小就可以知道。如果你的條件在程式編譯前就已經確定了,那就用#if;如果條件需要在程式執行過程中才能判斷,則用if。

所以 簡單地講,條件編譯是根據 巨集條件 選擇性地編譯語句,它是編譯器在編譯**時完成的;條件語句是根據條件表示式選擇性地執行語句,它是在程式執行時進行的。

#if的後面接的是表示式

#if (max==10)||(max==20)

code...

#endif

它的作用是:如果(max10) || (max20)成立,那麼編譯器就會把其中的#if 與 #endif之間的**編譯進去(注意:是編譯進去,不是執行!!)

#if後面接的是乙個巨集。

#if defined (x)

...code...

#endif

這個#if defined它不管裡面的「x」的邏輯是「真」還是「假」它只管這個程式的前面的巨集定義裡面有沒有定義「x」這個巨集,如果定義了x這個巨集,那麼,編譯器會編譯中間的…code…否則直接忽視中間的…code…**。

另外 #if defined(x)也可以取反,也就用 #if !defined(x)

#include #define config_debug 

int main()

#ifdef config_debug

printf("open test.txt ok");

#endif

return 0;

}

#ifdef的使用和#if defined()的用法一致 

#ifndef又和#if !defined()的用法一致。

最後強調兩點:

第一:這幾個巨集定義只是決定**塊是否被編譯!

第二:別忘了#endif

#ifdef _***x

...程式段1...

#else

...程式段2...

#endif

這表明如果識別符號_***x已被#define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。

3:情況3:

#if 常量

...程式段1...

#else

...程式段2...

#endif

這裡表示,如果常量為真(非0,隨便什麼數字,只要不是0),就執行程式段1,否則執行程式段2。

//巢狀情況

#if 常量a

...程式段1...

#else

#if 常量b

...程式段2...

#else

...程式段3...

#endif

#endif

這裡表示,如果常量a為真(非0,隨便什麼數字,只要不是0),就執行程式段1。當常量a為0,常量b為真時,執行程式段2;當常量a為0,常量b為0時,執行程式段3;

條件編譯 if endif ifdef等

最近在看c 專案,發現專案裡新增了好多 if等符號,查了一下,發現,他們作用不小。所謂的 if等符號,包含 if,elif,ifdef,else,ifndef,endif,總稱條件編譯。首先,所謂的條件編譯,是指在我們書寫代 完成之後,編譯之前的預編譯階段發揮作用。大體就是決定是否編譯。舉個例子,如...

C 條件編譯的理解

if 為條件編譯,只有符合條件的情況下才執行編譯,由於是編譯階段所以可以對任何 片做此處理 例 if subsystem windows int apientry twinmain hinstance hinstance,hinstance,lptstr lpcmdline,int ncmdshow...

關於Visual Studio的條件編譯

最近把visual studio 2013 rc公升級到了visual studio 2013 rtm,順手查了一下關於軟體版本的知識,了解到通常軟體的正式版比測試版要小一些。原因在於在測試版期間,程式設計師新增了很多的測試用來排查軟體中的bug,這些測試 會被編譯到軟體中,軟體通常較大,而這些測試...