C 中 if ifdef 的作用

2022-09-15 14:54:25 字數 1945 閱讀 9414

一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件

編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。

條件編譯

命令最常見的形式為:

#endif

#denif

在標頭檔案中使用#ifdef和#ifndef是非常重要的,可以防止雙重定義的錯誤。

就可以避免這樣的問題。因為當你已經包含過這個檔案,_aaa_就會有了定義,那麼#ifndef的條件為假,就不會再執行後面的類定義了。

#endif     //標頭檔案結尾

有時候,在b.h中會include   "a.h"  ,在"c.h"中會include   "b.h"及include"a.h", 這時,如果不用ifndef/endif,就會包含兩次a.h,產生錯誤。

還是把頭檔案的內容都放在#ifndef和#endif中吧。不管你的標頭檔案會不會被多個檔案引用,你都要加上這個。一般格式是這樣的:

#define 《標識》

...... 

#endif

《標識》在理論上來說可以是自由命名的,但每個標頭檔案的這個「標識」都應該是唯一的。標識的命名規則一般是頭檔名全大寫,前後加下劃線,並把檔名中的「.」也變成下劃線,如:stdio.h 

#define _stdio_h_

......

#endif 

2.在#ifndef中定義變數出現的問題(一般不定義在#ifndef中)。

#ifndef aaa

#define aaa

...int i;

...#endif

裡面有乙個變數定義,在vc中鏈結時就出現了重複定義的錯誤,而在c中成功編譯。

結論:(1).當你第乙個使用這個頭的.cpp檔案生成.obj的時候,int i 在裡面定義了當另外乙個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然後兩個obj被另外乙個.cpp也include 這個頭的,連線在一起,就會出現重複定義.

(2).把源程式副檔名改成.c後,vc按照c語言的語法對源程式進行編譯,而不是c++。在c語言中,若是遇到多個int i,則自動認為其中乙個是定義,其他的是宣告。

(3).c語言和c++語言連線結果不同,可能(猜測)時在進行編譯的時候,c++語言將全域性

變數預設為強符號,所以連線出錯。c語言則依照是否初始化進行強弱的判斷的。(參考)

解決方法:

(1).把源程式副檔名改成.c。

(2).推薦解決方案:

.h中只宣告 extern int i;在.cpp中定義

#ifndef __x_h__

#define __x_h__

extern int i;

#endif //__x_h__

int i;

注意問題:

(1).變數一般不要定義在.**件中。

下面是乙個例子:編譯後出現的錯誤---------fatal error c1189: #error : windows.h already in

種情況本質上就是對windows.h標頭檔案重複引用

,解決的辦法,如果能不引用此標頭檔案當然就不要引用,如果非得引用,或者是引用其他標頭檔案導致的間接引用windows.h,那

麼不要在stdafx.**件裡面引用,

一般可以解決。

或者可使用如下**:

所以使用如下**:

#ifdef _windows_

#undef _windows_

#endif

或者#ifndef #define #endif

如果還不行,就換一下頭檔案位置,#include "stdafx.h"放在#include 之前

C 中 的作用

c 中 的作用 的作用 1,忽略轉義字元 例如string filename d 文字檔案 text.txt 使用 後 string filename d 文字檔案 text.txt 2,讓字串跨行輸出 例如 string strsql select from humanresources.empl...

C 中 的作用

雙冒號 操作符被稱為域操作符 scope operator 含義和用法如下 1.在類外部宣告成員函式。void point area 2.呼叫全域性函式 表示引用成員函式變數及作用域,作用域成員運算子 例 system math sqrt 相當於system.math.sqrt 3.呼叫類的靜態方法...

c 中 的作用

1.用 可以不用寫轉義字元。如檔案路徑,可以不用寫兩個反斜槓,即忽略轉義 2.可以讓字串跨行。1 string script 2a 1 3b hello world 4c true56 d 1415 function e 16print i am e 17end 1819 function f a,...