頭文件中 ifndef/define/endif 有什麼用?

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有什麼做用?我應該這麼回答:

該宏定義修飾頭文件,防止頭文件中存在類定義的時候,單個文件屢次包含該頭文件,出現了類的重定義錯誤!

(重定義錯誤出現條件:頭文件存在類定義 & 某個文件屢次包含該頭文件)

再問:難道不能防止其餘普通類型的重複定義嗎?

回答:

假如你在頭文件中定義普通類型,條件定義能夠防止在同一文件包含多個頭文件的重複定義,

但仍是不能防止多個文件包含頭文件的重複定義。

既然在頭文件定義了,就存在被多個文件包含的可能,因此這時的條件定義幾乎沒有意義,甚至會產生誤導!

 

這是我最後一次總結定義和聲明相關的知識點了,我保證!

相關文章
相關標籤/搜索