⑴ C語言頭文件中定義結構體的問題
C語言程序設計中,為防止頭文件在同一編譯單元被重復引用,常引入#ifndef宏來進內行保護,如:頭文件容my_head.h
#ifndef_MY_HEAD_H_//如果沒有定義宏_MY_HEAD_H_
#define_MY_HEAD_H_//則,定義該宏名
//以下是被保護的代碼區
//進行相應的全局變數和結構體類型定義
typedefstructstu{
inta;
intb;
}STU;
#endif//宏判斷結束
這樣,當整個代碼中,多次引用這個my_head.h時,只有一次是生效的,系統編譯時,如果檢查宏_MY_HEAD_H_ 已經定義,就不會再進入被保護的代碼區了。
PS: 宏名,一般是與頭文件名相同,只是把字母全大寫,前後加上下劃線(_)
⑵ 關於自定義頭文件在多個文件中引用時提示重復定義的問題(C語言)
#ifndef identifier_h
#define identifier_h
....
#endif
這套條件編譯是為了防止同一個.c文件中包含多個相同.h文件的(比如專有一個.c文件包含了屬a.h,a.h又包含了b.h,那麼當你在這個.c文件中同時包含了a.h和b.h時,因為有上面的條件編譯的關系而不會出錯)。因為編譯器在編譯的時候是按照.c文件為單位編譯的,每個.c文件編譯成.o文件(linux系統)或者.obj(windows系統),然後再將這些.o文件鏈接起來,最後與運行庫鏈接形成可執行文件(elf或exe文件)。
你在兩個.c文件中包含了同一個.h文件。這根本和條件編譯沒什麼關系。你在.h文件中定義了全局變數a, b, c。那麼就表示你兩個.c文件中,每個.c文件中都有這樣的全局變數定義:int a, b, c;當每個.c文件單獨編譯當然沒有問題,但是當它們鏈接起來的時候就出現問題了:兩個.c文件中都有變數a b c,所以當然是重復定義啊。問題是出在鏈接的時候的。