預處理 條件編譯

2021-07-31 13:33:22 字數 2309 閱讀 7146

假如現在要開發乙個c語言程式,讓它輸出紅色的文字,並且要求跨平台,在 windows 和 linux 下都能執行,怎麼辦呢?

這個程式的難點在於,不同平台下控制文字顏色的**不一樣,我們必須要能夠識別出不同的平台。

windows 有專有的巨集_win32,linux 有專有的巨集__linux__,以現有的知識,我們很容易就想到了 if else,請看下面的**:

#include

int main()else if(__linux__)else

return 0;

}但這段**是錯誤的,在 windows 下提示 __linux__ 是未定義的識別符號,在 linux 下提示 _win32 是未定義的識別符號。對上面的**進行改進:

#include

int main()

#if、#elif、#else 和 #endif 都是預處理命令,整段**的意思是:如果巨集 _win32 的值為真,就保留第 4、5 行**,刪除第 7、9 行**;如果巨集 __linux__ 的值為真,就保留第 7 行**;如果所有的巨集都為假,就保留第 9 行**。

這些操作都是在預處理階段完成的,多餘的**以及所有的巨集都不會參與編譯,不僅保證了**的正確性,還減小了編譯後檔案的體積。

這種能夠根據不同情況編譯不同**、產生不同目標檔案的機制,稱為條件編譯。

條件編譯是預處理程式的功能,不是編譯器的功能。

條件編譯有多種形式,下面一一講解。

#if 命令

#if 命令的完整格式為:

#if 整型常量表示式1

程式段1

#elif 整型常量表示式2

程式段2

#elif 整型常量表示式3

程式段3

#else

程式段4

#endif

它的意思是:如常「表示式1」的值為真(非0),就對「程式段1」進行編譯,否則就計算「表示式2」,結果為真的話就對「程式段2」進行編譯,為假的話就繼續往下匹配,直到遇到值為真的表示式,或者遇到 #else。這一點和 if else 非常類似。

需要注意的是,#if 命令要求判斷條件為「整型常量表示式」,也就是說,表示式中不能包含變數,而且結果必須是整數;而 if 後面的表示式沒有限制,只要符合語法就行。這是 #if 和 if 的乙個重要區別。

#elif 和 #else 也可以省略,如下所示:

#include

int main()

#ifdef 命令

#ifdef 命令的格式為:

#ifdef  巨集名

程式段1

#else

程式段2

#endif

它的意思是,如果當前的巨集已被定義過,則對「程式段1」進行編譯,否則對「程式段2」進行編譯。

也可以省略 #else:

#ifdef  巨集名

程式段#endif

vs/vc 有兩種編譯模式,debug 和 release。在學習過程中,我們通常使用 debug 模式,這樣便於程式的除錯;而最終發布的程式,要使用 release 模式,這樣編譯器會進行很多優化,提高程式執行效率,刪除冗餘資訊。

為了能夠清楚地看到當前程式的編譯模式,我們不妨在程式中增加提示,請看下面的**:

#include

#include

int main()

當以 debug 模式編譯程式時,巨集 _debug 會被定義,預處器會保留第 5 行**,刪除第 7 行**。反之會刪除第 5 行,保留第 7 行。

#ifndef 命令

#ifndef 命令的格式為:

#ifndef 巨集名

程式段1 

#else 

程式段2 

#endif

與 #ifdef 相比,僅僅是將 #ifdef 改為了 #ifndef。它的意思是,如果當前的巨集未被定義,則對「程式段1」進行編譯,否則對「程式段2」進行編譯,這與 #ifdef 的功能正好相反。 區別

最後需要注意的是,#if 後面跟的是「整型常量表示式」,而 #ifdef 和 #ifndef 後面跟的只能是乙個巨集名,不能是其他的。

例如,下面的形式只能用於 #if:

#include

#define num 10

int main()

執行結果:

num: 10

再如,兩個巨集都存在時編譯**a,否則編譯**b:

#include

#define num1 10

#define num2 20

int main()

執行結果:

num1: 10, num2: 20

#ifdef 可以認為是 #if defined 的縮寫。

預處理 條件編譯

條件編譯 預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目標 檔案。這對於程式的移植和除錯是很有用的。條件編譯有三種形式 ifdef ifndef if 1 ifdef ifdef 識別符號 程式段1 else 程式段2 endif 或者 ifdef 識別符號 ...

預處理 巨集定義 條件編譯

可以用 define命令將乙個指定的識別符號 即巨集名 來代表乙個字串 巨集定義語法 define 巨集名 字串 使用原則 1 原樣替換 2 不能代替函式 3 定義時字尾不要加分號。帶引數的巨集定義 include define s a,b a b 注意,此處不能加分號,否則就變成了s a b in...

C 預處理 之 條件編譯

序號描述 1展開所有的標頭檔案 2巨集定義的替換 3解析條件編譯 並新增到檔案中 預處理命令 以符號 開頭。採用 條件編譯,可以減少被編譯的語句,從而減少目標的長度。當 條件編譯 段比較多時,目標程式長度可以大大減少。序號命令含義 1 if 編譯預處理 的 條件命令,相當於c語言中的 if 語句 2...