看板 C_and_CPP 關於我們 聯絡資訊
一個可以被多處引用的 Header 要能避免自己被重複載入 也只有變數、函式的宣告,這能透過前置處理置來搞定。 ============================================================== main.c #include "featureA.h" int main() { showFeatureA(); return 0; } 在 main.c 內,引用了一個 header。 它們的寫法跟您寫的差別只是多了前置處理器, 並且將實作與宣告分離在 .c 與 .h ============================================================== featureA.h #ifndef __FEATURE_A_H #define __FEATURE_A_H int featureA; void showFeatureA(); #endif ============================================================== featureA.c #include "featureA.h" #include <stdio.h> void showFeatureA() { printf("featureA %d\n", featureA); } ========================================================================== 在 feature.h 內,透過檢查是不是 __FEATURE_A_H 是否被定義過, 來決定是不是會有 featureA.h 的內容。 我們知道,compiler 在前處理的時候,會展開前置處理器的定義。 把 #include 的內容,合併至引用的檔案內。 所以,當第一次被 #include 時,會包含 featureA.h 本身的內容。 第二次被 #include 時,就會是空的(因為 __FEATURE_A_H 已定義) 透過這樣的寫作慣例,我們盡情地引用 header 而不會產生錯誤。 另一種產生錯誤的情況是,一個變數被重複定義。 這通常會發生在 header 第二次被引用時, 常是忘了在 header 內只寫宣告的原則。 若我們將 featureA.h 內的 int featureA; 改寫成 int featureA = 0; 您就會得到這樣的錯誤: gcc main.c featureA.o featureA.o:(.bss+0x0): multiple definition of `featureA' /tmp/ccIWzIWE.o:(.bss+0x0): first defined here collect2: ld 回傳 1 make: *** [all] Error 1 只要善用前置處理器以及不在 header 內定義變數、函式, 就能與 header 合平共存。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.52.57
loveflames:int featureA是定義,不過放在header不會出現重覆定義 11/14 22:44
loveflames:的錯誤,除非給它初值 11/14 22:45
loveflames:忘了說C語言限定 11/14 22:45
purpose:就 header 內寫 extern int featureA; 11/14 23:00
loveflames:只有C++才要加extern吧 11/14 23:06
purpose:覺得加了比較保險 11/14 23:28
manlike:一定要加extern吧 除非你這個.h只會被一個檔案include = = 11/15 01:44
manlike:不對 沒看仔細 = =" 11/15 01:46
manlike:像這種global變數通常會宣告定義在.c內 .h宣告extern = = 11/15 01:50