今天繼續寫實驗班的程式,出了問題,這就引出了乙個很重要的問題。之前不是很懂的。今天終於碰到了。
情景:你建了乙個工程,包含兩個 cpp 檔案,乙個標頭檔案 。
乙個錯誤的認識是保護巨集可以防止變數被重複定義。。。。。。是這樣嗎?
a.cpp:
#include #include "zmx.h"
using namespace std;
int main()
b.cpp:
#include #include "zmx.h"
using namespace std;
int voi()
然後 zmx.h:
#ifndef __zmx_h
#define __zmx_h
int a;
#endif // __zmx_h
這樣,真的可以嗎?一編譯。。。
multiple definition ...........那麼你的想法是什麼呢?
問題出在 你把c 和c++編譯的單元看成是整個工程了。。。這就是問題所在。。。你以為乙個檔案中定義了保護巨集,另乙個檔案會看到?
看不到的,兄弟,另乙個檔案 include 的時候,在這個檔案中是沒有定義保護巨集的,所以他還會執行變數定義。。。。
每個檔案編譯成.o 檔案後,還要鏈結吧,是吧,然後 兩個檔案中定義了同名變數就出現了這個問題。
在同乙個檔案中include 這個標頭檔案兩次沒有出問題,也從側面驗證了這個想法。
可以看本部落格的另一篇文章
標頭檔案中不可以放變數的定義
注意標頭檔案中不可以放變數的定義!一般情況下標頭檔案中只放變數的宣告,因為標頭檔案 要被其他檔案包含 即 include 如果把定義放到標頭檔案的話,就不能避免多次定義變數,c 不允許多次定義變數,乙個程式中對指定變數的定義只有一次,宣告可以無數次。不過有三個例外,一下三中實體的定義也可放到標頭檔案...
解決標頭檔案定義變數的問題,巧用巨集定義 續)
繼昨天遇到的標頭檔案定義變數問題,總得要想辦法解決啊,不然xcode沒法除錯啊 改還得要從頭檔案改起,想到符號重複問題是因為多個.c都包含了這個標頭檔案,都定義了一次,所以鏈結就不知道要哪乙個了啊,常見的解決辦法不就是加extern唄。但是這個工程師所有的都是包含的乙個 萬能 標頭檔案,所以要是加了...
關於標頭檔案保護和變數重複定義的一點理解
之前一直都有乙個困惑 既然標頭檔案一般都有避免重複編譯的預編譯條件保護,那為什麼在標頭檔案中定義全域性變數就會出現重複定義的錯誤呢?這個困惑持續了很久,一直到最近才算大概理解。現記錄於此,也許理解的不正確,希望不吝指正。所謂標頭檔案保護,指的是通過對巨集的檢測,來達到避免重複編譯的目的。比如 ifn...