ifdef 條件編譯,其實如此簡單

2021-06-29 06:35:12 字數 1216 閱讀 4926

今天看乙個問題

怎麼消滅標頭檔案被多次include導致的錯誤?

一種方法是:在標頭檔案的開頭寫下

#pragma once

#pragma once(比較常用)

只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次,這條指令實際上在vc6中就已經有了,但是考慮到相容性並沒有太多的使用它。

#pragma once是編譯相關,就是說這個

編譯系統上能用,但在其他編譯系統不一定可以,也就是說移植性差,不過現在基本上已經是每個

編譯器都有這個定義了。

另一種方法:就是要用到條件編譯,關於怎麼解決「標頭檔案被多次include導致的符號重定義錯誤」參考blog

#ifndef,#define,#endif這個是c++語言相關,這是c++語言中的巨集定義,通過巨集定義避免檔案多次編譯。所以在所有支援c++語言的編譯器上都是有效的,如果寫的程式要跨平台,最好使用這種方式

以下只介紹條件編譯,內容如下:

這幾個巨集是為了進行

條件編譯

。一般情況下,源程式中所有的行都參加

編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行

編譯,也就是對一部分內容指定編譯的條件,這就是「

條件編譯

」。有時,希望當滿足某條件時對一組語句進行

編譯,而當條件不滿足時則編譯另一組語句。

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

使用方法:

在#ifdef之前如果出現#idefine 識別符號(對應的識別符號),那麼久執行程式段1,否則執行程式段2.如下我自己寫的簡單的例子

編譯上圖code,只會編譯#else到#endif的部分,及執行結果是只輸出:runing else part.

上圖中第六行加入 #define debug  ,則遇到條件編譯時,只會編譯#ifdef到#else中間的部分。執行結果為:runing main part

條件編譯的好處,優點:

有人會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什麼好處呢?的確,此問題完全可以不用條件編譯處理,但那樣做目標程式長(因為所有語句都編譯),而採用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程式長度可以大大減少。



條件編譯 ifdef用法

這幾個巨集是為了進行條件編譯。一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部 分內容指定編譯的條件,這就是 條件編譯 有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。條件編譯命令最常見的形式為 ifdef 識...

if 和 ifdef 條件編譯注意

之前寫程式很少用到這兩個條件編譯,只是在標頭檔案的開頭使用過 ifdef endif,他是防止標頭檔案被重複包含,導致的變數被多處宣告或定義。最近寫程式發現 if endif 也是特別好用的。if 他的後面是接乙個表示式 if if need display 使用c語言庫函式 sprintf 把數字...

C ifdef的簡單條件編譯

今天在看原始碼時,發現乙個很神奇的用法,可能有大神在以前早已知曉甚至經常使用,不過對於菜鳥的我來說,還是像發現新大陸那樣 究竟是什麼語法呢?我們一步步來看看吧 include stdio.h int main return 3 邏輯比較簡單,主要的意思就是 當1 1 恒為真 分別執行 printf ...