C 條件編譯指令和defined 操作符

2021-09-27 16:07:39 字數 2520 閱讀 3785

使用條件條件編譯指令,可以限制程式中的某些內容要在滿足一定條件下才參與編譯。因此,可以利用條件編譯指令使同乙個源程式在不同的編譯環境下產生不同的目標**。在標頭檔案中使用#ifdef和#ifndef是非常重要的,可以防止雙重定義錯誤的出現。

常用的條件編譯語句有下列5種形式:

形式一

#if 常量表示式

程式段 //當「常量表示式」為非零時,編譯此程式段

#endif

此形式是條件編譯語句最簡單的形式,和if語句的使用方法原理上一樣,當#if後的常量表示式為非零時,才會執行程式段,否則就跳過此程式段。

形式二

#if 常量表示式

程式段1 //當「常量表示式」為非零時,編譯此程式段

#else

程式段2 //當「常量表示式」為零時,編譯此程式段

#endif

此形式的使用方法和if else語句的使用方法原理上一樣,當#if後的常量表示式為非零時,會執行程式段1,常量表示式為零時,會執行程式段2。

形式三

#if 常量表示式1

程式段1 //當「常量表示式1」為非零時,編譯此程式段

#elif 常量表示式2

程式段2 //當「常量表示式1」為零,「常量表示式2」為非零時,編譯此程式段

......

#elif 常量表示式n

程式段n //當「常量表示式1」、...、「常量表示式n-1」均為零,「常量表示式n」為非零時,編譯此程式段

#else

程式段n+1 //其他條件下,編譯此程式段

#endif

此形式的使用方法和if -else if...-else的使用方法如出一轍,就不再細說了。

形式四:(#ifdef

#ifdef 識別符號

程式段1

#else

程式段2

#endif

此形式中,如果「識別符號」經過#define定義過,且未經過#undef刪除,則編譯程式段1,否則編譯程式段2。如果沒有程式段2,則#else可以省略。

形式五:(#ifndef

#ifndef 識別符號

程式段1

#else

程式段2

#endif

此形式中,如果「識別符號」未被#define定義過,則編譯程式段1,否則編譯程式段2。如果沒有程式段2,則#else可以省略。此形式,常常用來避免重複包含.h檔案,出現編譯錯誤。會將.h檔案寫成如下形式:

//***.h

#ifndef _***_h_

#define _***_h_

......

...#endif

這樣就不會出現重複定義的錯誤了。首先判斷識別符號_***_h_是否被定義過,若_***_h_被定義過,則說明檔案.h呼叫過一次;若再次呼叫時,因為_***_h_被定義,就會跳過這個程式段,就不會出現重複定義的問題。

defined 操作符

defined是乙個預處理操作符,而不是指令,因此 不要以#開頭。defined操作符的使用形式為:

defined  (識別符號)

若「識別符號」在此前經過#define定義過,並且未經過#undef刪除,上述表示式為非0,否則上述表示式的值為0。下面兩種寫法完全等效的:

#ifndef _***_h_

#define _***_h_

......

...#endif

等價於

#if!defined (_***_h_)

#define _***_h_

......

...#endif

條件編譯指令

條件編譯指令 對源程式進行有條件的編譯 主要用於除錯程式 與分支語句的區別 1 不需要占用記憶體空間 2 執行時間不一樣 3.多檔案程式設計 定義巨集 define debug1 0 define ia64 define ia32 define llvm3 int main nslog d sum ...

C C 預編譯指令和條件編譯

1.常見的預編譯指令和條件編譯項有如下這些 define undef ifdef ifndef if elif else endif 1 define 定義乙個預處理巨集 2 undef 取消巨集的定義 3 if 編譯預處理中的條件命令,相當於c語法中的if語句 4 ifdef 判斷某個巨集是否被定...

C語言 預處理指令 條件編譯

感謝 一 條件編譯 概念 在很多情況下,我們希望程式的其中一部分 只有在滿足一定條件時才進行編譯,否則不參與編譯 只有參與編譯的 最終才能被執行 這就是條件編譯。二 基本用法 1.if 條件1 code1.elif 條件2 code2.else code3.endif1 如果條件1成立,那麼編譯器就...