C語言條件編譯詳解(跨平台必備)

2021-08-21 03:51:30 字數 2322 閱讀 7936

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

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

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

#include

intmain

()else

if(__linux__)

else

return0;

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

#include

intmain

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

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

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

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

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

#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

intmain

()#ifdef 命令的格式為:

#ifdef  巨集名    程式段1#else    程式段2#endif

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

也可以省略 #else:

#ifdef  巨集名    程式段#endif

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

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

#include

#include

intmain

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

#ifndef 命令的格式為:

#ifndef 巨集名

程式段1 

#else 

程式段2 

#endif

與 #ifdef 相比,僅僅是將 #ifdef 改為了 #ifndef。它的意思是,如果當前的巨集未被定義,則對「程式段1」進行編譯,否則對「程式段2」進行編譯,這與 #ifdef 的功能正好相反。最後需要注意的是,#if 後面跟的是「整型常量表示式」,而 #ifdef 和 #ifndef 後面跟的只能是乙個巨集名,不能是其他的。

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

#include

#define num 10

intmain

()執行結果:

num: 10

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

#include

#define num1 10

#define num2 20

intmain

()執行結果:

num1: 10, num2: 20

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

C語言條件編譯詳解

預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目標 檔案。這對於程式的移植和除錯是很有用的。條件編譯有三種形式,下面分別介紹 ifdef 識別符號 程式段1 else 程式段2 endif 它的功能是,如果識別符號已被 define命令定義過則對程式段1進行編譯...

c語言條件編譯詳解

指令 用途 空指令,無任何效果 include 包含乙個源 檔案 define 定義巨集 undef 取消已定義的巨集 if 如果給定條件為真,則編譯下面 ifdef 如果巨集已經定義,則編譯下面 ifndef 如果巨集沒有定義,則編譯下面 elif 如果前面的 if給定條件不為真,當前條件為真,則...

C語言條件編譯詳解

指令 用途 空指令,無任何效果 include 包含乙個源 檔案 define 定義巨集 undef 取消已定義的巨集 if 如果給定條件為真,則編譯下面 ifdef 如果巨集已經定義,則編譯下面 ifndef 如果巨集沒有定義,則編譯下面 elif 如果前面的 if給定條件不為真,當前條件為真,則...