C++頭文件報錯,頭文件保護符使用

提要

C++頭文件是爲了聲明函數,聲明變量。
注意,是聲明。 int a=1;是直接定義了。
extern int a; 這是聲明,指示編譯器這個變量可能在別的文件中被定義,編譯器會在符號表中找到定義後填入響應的值。
一個項目中一個變量只會有一次定義,多次定義就叫重定義了。

丟人的錯誤

[點擊並拖拽以移動]在這裏插入圖片描述
  看這個tou.h,我在a.cpp和b.cpp都include了,然後報錯,a重定義了,顯然如此,因爲這是一個項目,把a.cpp和b.cpp單獨鏈接成a.o和b.o之後不會報錯,到最後編譯鏈接成項目名.exe就會出現全局變量重定義,後來仔細想想,我對頭文件的理解有失偏駁。

  頭文件就是爲定義而生的,然後創建同名.cpp文件進行實現,我多次定義當然會報錯。編譯器看到一個聲明,會在符號表中存儲下來,遇到定義之後找到對應值然後完成賦值,你每定義一次創建一次變量便會報錯。(把.h當成字符串替換便可)

頭文件保護符#ifndef不是針對這種情況的,每個頭文件加上這個是個好習慣,如果不加可能會出現以下場景:
有A.h,裏面定義了一些方法。
有B.h,裏面#include了A.h,也定義了一些方法。
現在main.cpp同時#include了A.h和B.h,就要報錯了,字符串替換後包含了兩次A.h,如果加了上頭文件保護符,再導入A.h會不用執行,就避免了這種情況。

長記性,避免再問無腦問題

把頭文件保護符這當成個習慣,會減少不必要的麻煩。
頭文件儘量不要使用命名空間,減少衝突。
如果想清楚地明白各個文件依賴關係什麼,頭文件替換是什麼樣子,建立用gcc/g++ -E預編譯測試下,一目瞭然。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章