可以說我正在使用標頭守衛,
#ifndef MAIN_H
#define MAIN_H
#include "foo.h"
#include "some_header_file.h"
... // Some Code
#endif
在 foo.h 檔案中也帶有 Header 保護。
#ifndef FOO_H
#define FOO_H
#include "some_header_file.h"
... // Some Code
#endif
如您所見,主檔案有 2 個標題,其中一個是重復的。我有三個問題:
- Header Guards 是否防止重復的頭檔案?
- 編譯器會優化它并洗掉它嗎?
- 這是一種不好的做法,應該從主檔案中洗掉額外的頭檔案嗎?
uj5u.com熱心網友回復:
Header Guards 是否防止重復的頭檔案?
是的。第一次遇到的包含會將標頭的內容帶到翻譯單元,并且標頭保護會導致連續的包含為空,從而防止標頭的內容被復制。這正是使用標頭保護的原因。
或者這是一種不好的做法,應該從主檔案中洗掉額外的頭檔案?
不,重復包含不是一個壞習慣。如果“main”頭檔案依賴于“some_header_file.h”中的任何宣告,那么“main”絕對應該直接包含“some_header_file.h”,無論另一個頭檔案——甚至是“main”包含的頭檔案——是否也包含它。
依賴傳遞包含通常是一種不好的做法——即在這種情況下,在將“foo.h”包含到“main”中時依賴“foo.h”包含“some_header_file.h”的細節可能是不好的。這樣的假設通常會導致程式在修改時意外中斷。在這種情況下,如果“foo.h”被修改為不再依賴于“some_header_file.h”,并且該包含被洗掉,那么該更改將突然導致假設失敗,并且“some_header_file.h”將不再是由于根本不涉及“main”的更改而包含在“main”中。那會很糟糕。
uj5u.com熱心網友回復:
重復包含的主要問題是當兩個不同的檔案相互包含時。例如,如果 ah 包含 bh,而 bh 包含 ah,如果不添加標頭保護,前處理器會進入一個回圈,因為每次讀取 ah 都包含 bh,而 bh 包含 ah,并且這永遠不會結束。
在您的情況下,如果您在 some_header_file.h" 中定義一個變數,您可能會遇到一些問題,因為它會被讀取兩次并且變數也會被宣告兩次,這將導致編譯器錯誤。
您需要將它們添加到“some_header_file.h”中,這樣??下次前處理器讀取此檔案時,ifndef 子句會忽略它。并注意回圈包含依賴項的重要性。
在“some_header_file.h”中添加:
#ifndef SOME_HEADER_FILE_H
#define SOME_HEADER_FILE_H
...code
#endif /* SOME_HEADER_FILE_H */
最后的評論不是必需的,但它有助于您需要除錯/查看前處理器輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412631.html
標籤:
上一篇:按位運算異或掩碼
下一篇:如何在定義之間添加空行?
