問題描述如下:
有 三個源文件,A.h、B.cpp、C.cpp。
A.h是頭文件,其中聲明瞭三個變量a1、a2、 a3。
B.cpp是A.h中所聲明的類的實現源代碼,C.cpp是主程序文件。B.cpp和C.cpp中均包含頭文件 A.h。
在編譯時,編譯能夠通過,但鏈接時出了問題,出現”error LNK1169: 找到一個或多個多重定義的符號“的錯誤。
經過分析,確定了這是由於兩個實現文件中重複包含了頭文件而造成的。可解決方法卻始終找不到。
要 注意的是,在這裏,在頭文件中加入#ifndef……#endif這樣的預編譯命令是沒用的,因爲這是防止嵌套包含頭文件的,而本例中並沒有嵌套包含,是 在兩個文件中分別包含。
因爲這三個變量在兩個實現文件中都要用到,所以一定要包含在A.h中。後來在網上找到了解決方法,其實很簡單。
就是在A.h中的三個變量聲明前加上extern 關鍵字,然後在B.cpp中不加extern關鍵字再次聲明這三個變量。於是編譯鏈接順利通過。
其實這是C++中比較基礎的問題。
還有種情況是定義了函數,但在另個文件中準備用#include打開,但是結果還是會出現。
直接包含不就在兩個cpp文件中都定義了相同的函數/變量嗎,鏈接時會出現重複定義(你自己試試),所以需要使用extren申明一下即可,他們使用的是同一個實體。
例如:
1、你在a.cpp中定義了一個函數
void func()
{
}
希望在b.cpp中調用,調用前就需要進行聲明,格式如下:
extren void func(); //extren 後面根的形式和函數定義形式要完全相同
void mian()
{
func();
}
2、1、你在a.cpp中定義了一個變量 int a;
希望在b.cpp中使用,使用前就需要進行聲明,格式如下:
extren int a; //extren 後面根的形式和變量定義形式要完全相同
void main()
{
int b = a;
}