1..h和.chtml
關於.h和.c的關係,定義和聲明打注意事項,我認爲早就已經掌握地很清楚了.函數
https://blog.csdn.net/u013082827/article/details/74196167spa
規則有5條:.net
(1) 對應的.c文件中寫變量、函數的定義
(2) 對應的.h文件中寫共用的變量、函數的聲明
(3) 若是有數據類型的定義 和 宏定義 ,請寫的頭文件(.h)中(僅做爲參考)
(4) 模塊的.c文件中別忘包含本身的.h文件
(5) 頭文件裏面儘可能只寫共用的東西,畢竟.h做爲同名.c的對外接口,不必爲了所謂的 簡潔,把全部的變量都往裏面放。
--------------------- htm
2. 重複聲明會出錯?blog
有一次聽別人說,重複聲明會出錯,還拿ifndef/define/endif 舉例說明:接口
假如不會出錯,還要ifndef/define/endif幹嗎?ip
當時感受頗有道理.get
不過漸漸地就懷疑了,這和我以前理解的不同啊.編譯器
試了一下,重複聲明不報錯!
這就引出一個問題:ifndef/define/endif究竟是幹嗎用的?
3. ifndef/define/endif 的用途
針對同一個.h文件,假如裏面有定義全局變量, 又被同一個.c文件直接或者間接包含屢次,就會有重複定義的風險.
經過添加ifndef/define/endif, 即便誰不懂事地在.h文件中定義變量,被同一個文件包含屢次也不會報錯.
可是,這個.h文件被多個.c文件include還會報出redefine錯誤!
由於ifndef/define/endif 只管一個文件.
你寫了.h文件,就有被多個.c文件include的危險.
參考: http://www.javashuo.com/article/p-svudohor-gg.html
4. 結合類的定義小結
對於普通變量,在同一個c文件下屢次定義會出現"重定義錯誤"; 在不一樣c文件下定義,也會出現"重定義錯誤";
(固然不一樣c文件在同一個project下面,且有連接關係)
經過ifndef/define/endif, 能夠避免同一個文件屢次定義出現的"重定義錯誤",可是沒法避免多個.c文件下的重定義錯誤;
然後者纔是常見的錯誤, 特別是在頭文件中定義了變量,頭文件被多個.c包含的時候.
對於類的定義,就不一樣了! 先說結論:
對於類, 在同一個c文件下屢次定義,會出現重定義錯誤; 在多個c文件中定義相同類,卻不會出現重定義錯誤!
由於類的定義不產生目標代碼,只是告訴編譯器類的數據格式.
經過ifndef/define/endif, 能夠避免同一個文件屢次定義類出現的"重定義錯誤",
因此,假如把類寫到頭文件中, 經過ifndef/define/endif 能夠徹底避免類的重複定義問題.
參考連接:https://www.cnblogs.com/rocketfan/archive/2009/10/02/1577361.html
5. 因此,假若有人問我#ifndef/define/endif有什麼做用?我應該這麼回答:
該宏定義修飾頭文件,防止頭文件中存在類定義的時候,單個文件屢次包含該頭文件,出現了類的重定義錯誤!
(重定義錯誤出現條件:頭文件存在類定義 & 某個文件屢次包含該頭文件)
再問:難道不能防止其餘普通類型的重複定義嗎?
回答:
假如你在頭文件中定義普通類型,條件定義能夠防止在同一文件包含多個頭文件的重複定義,
但仍是不能防止多個文件包含頭文件的重複定義。
既然在頭文件定義了,就存在被多個文件包含的可能,因此這時的條件定義幾乎沒有意義,甚至會產生誤導!
這是我最後一次總結定義和聲明相關的知識點了,我保證!