本人在測試剛剛安裝的vs2017時運行出了問題, 錯誤信息為 "fatal error LNK1169: 找到一個或多個多重定義的符號", 代碼如下:
//Myfile.h #include<iostream> #include<iomanip> #include<cmath> int fac(int n) { int t = 1; for (int i = 1; i <= n; i++) { t *= i; } return t; } float max(float x1, float x2) { return (x1 > x2 ? x1 : x2); } void menu() { printf("hello world\n"); } //test.cpp #include "Myfile.h" using namespace std; int main() { cout << fac(5) << endl; cout << max(3, 9) << endl; menu(); return 0; }
仔細思考了下報錯原因, 在頭文件包含到test.cpp時, 而實際上Myfile.h中包含了構造函數的實現,於是test.cpp生成目標文件的時候,包含了構造函數的實現。而test.cpp也包含了test.h,同樣編譯生成目標文件的時候,也會包含構造函數的實現。這樣二者在鏈接階段就會發現有兩個一模一樣的函數,出現了重定義的問題. 解決方法如下:
將函數的聲明放在頭文件Myfile.h里, 函數的定義則放在test.cpp中, 這樣運行后沒有報錯. 另外, 由於是重定義發生了錯誤, 所以如果我們用內聯函數, 這樣在執行時是嵌入代碼塊, 這樣也就不會再出現函數的重定義的問題.
同樣的, 除了函數的定義不能在頭文件里實現, 變量的定義以及類的方法的定義同樣不能放在頭文件里, 這樣出現重定義報錯的情況.