當前位置:才華齋>計算機>C語言>

C語言條件編譯分析例項

C語言 閱讀(2W)

引導語;一般情況下,源程式中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件下才進行編譯,即對一部分內容指定編譯條件,這就是“條件編譯”(conditional compile)。以下是本站小編分享給大家的C語言條件編譯分析例項,歡迎閱讀!

C語言條件編譯分析例項

條件編譯

參看:條件編譯#ifdef的妙用詳解_透徹

#if:表示如果...

#ifdef: 表示如果定義...

#ifndef:表示如果沒有定義...

#else: 表示否則...與#ifdef/#ifndef搭配使用 //筆試題 注意,沒有#elseif

#elif: 表示否則如果...與#if/#ifdef/#ifndef搭配使用

#endif: 表示結束判斷,與#if/#ifdef/#ifndef搭配使用

注意:#if 和 if 區別

#if=>主要用於編譯期間的檢查和判斷

if =>主要用於程式執行期間的檢查和判斷Z

最常見的形式:

#ifdef 識別符號

程式段1

#else

程式段2

#endif

作用:當識別符號已經被定義過(一般用#define命令定義),則對程式段1進行編譯,否則編譯程式段2。其中#else部分也可以沒有,即:

#ifdef 識別符號

程式段1

#endif

這裡的“程式段”可以是語句組,也可以是命令列。這種條件編譯可以提高C源程式的通用性。如果一個C源程式在不同計算機系統上執行,而不同的計算機又有一定的差異。例如,我們有一個數據型別,在Windows平臺中,應該使用long型別表示,而在其他平臺應該使用float表示,這樣往往需要對源程式做必要的修改,這就降低了程式的通用性。可以用以下的條件編譯:

#ifdef WINDOWS

#define MYTYPE long

#else

#define MYTYPE float

#endif

如果在Windows上編譯程式,則可以在程式的開始加上

#define WINDOWS

這樣則編譯下面的命令列:

#define MYTYPE long

如果在這組條件編譯命令之前曾出現以下命令列:

#define WINDOWS 0

則預編譯後程序中的MYTYPE都用float代替。這樣,源程式可以不必任何修改就可以用於不同型別的計算機系統。當然以上介紹的只是一種簡單的情況,可以根據此思路設計出其他的條件編譯。

例如,在除錯程式時,常常希望輸出一些所需的資訊,而在除錯完成後不再輸出這些資訊。可以在源程式中插入以下的條件編譯段:

#ifdef DEBUG

print ("device_open(%p)n", file);

#endif

如果在它的前面有以下命令列:

#define DEBUG

則在程式執行時輸出file指標的值,以便除錯分析。除錯完成後只需將這個define命令列刪除即可。有人可能覺得不用條件編譯也可以達到此目的,即在除錯時加一批printf語句,除錯後一一將prntf語句刪除。的確,這是可以的。但是,當除錯時加的printf語句比較多時,修改的工作量是很大的。用條件編譯,則不必一一刪除printf語句。只需刪除前面的一條#define DEBUG 命令即可,這時所有的用DEBUG 作識別符號的條件編譯段都使其中的printf語句不起作用,起到統一控制的作用,如同一個“開關”一樣。

有時也採用下面的形式:

#ifndef 識別符號

程式段1

#else

程式段2

#endif

只是第一行與第一種形式不同:將“#ifdef”改為“#ifndef”。它的'作用是,若識別符號未被定義則編譯程式段1,否則編譯程式段2。這種形式與第一種形式的作用相反。

一般地,當某檔案包含幾個標頭檔案,而且每個標頭檔案都可能定義了相同的巨集,使用#ifndef可以防止該巨集重複定義。

/*test.h*/

#ifndef SIZE

#define SIZE 100

#endif

#ifndef 指令通常用於防止多次包含同一檔案,也就是說,標頭檔案可採用類似下面幾行的設定:

//標頭檔案衛士

#ifndef THINGS_H_

#define THINGS_H_

#endif