c++工程重複編譯與重複定義

#ifndef #define #endif防止的是「重複編譯」,而不是「重複定義」
重複編譯可能形成重複定義,但重複定義的來源不僅有重複編譯

從代碼變成可執行的程序,須要兩個步驟
編譯和連接
編譯開始時,將全部#include頭文件的地方替換成該頭文件的代碼
在編譯階段,編譯全部源文件成爲模塊,各模塊中的每一個變量與函數都獲得了屬於本身的空間
在連接階段,各個模塊被組合到一塊兒

#ifndef可以防止在編譯階段,一段代碼被重複編譯,而且由此能夠避免一個變量被重複定義
但它不能防止連接階段,各模塊中都有叫某個名字的變量,因而報連接錯誤:變量重複定義

解決方法即不只用#ifndef組合防止重複編譯,並且將變量在源文件中定義,只在頭文件裏放extern聲明
這樣各模塊在編譯的時候,就知道「有這麼個變量,但它的空間不在我這裏」,連接的時候,這個變量雖然出如今全部包含這個頭文件的模塊裏,但只有一個模塊是它的真身所在函數

相關文章
相關標籤/搜索