一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件
編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。
條件編譯
命令最常見的形式為:
#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,...