C++ 引用防護(Include Guard)
你在看 C++ 的 code 時,header 部分常常會看到下面這種 code
1
2
3
4
5
6
7
#ifndef MYHEADER_H
#define MYHEADER_H
// 在這裡放置頭文件的內容
#endif // MYHEADER_H
這倒底在幹嘛?跟條件編譯有關嗎? 真心覺得 C++ 很難學的原因之一就是太多細節,很容易搞混。 光是 reference & and pointer * 搞懂,大概就不想學了。 然後還有 pointer of pointer ** …
言歸正傳,這跟條件編譯沒有關係,它的目的在於不想要 header 被重複 include
在這個範例中,MYHEADER_H 是自定義的宏名稱,用於標識 include guard。 當某個檔案第一次包含這個 header 時,MYHEADER_H 是未定義的, 所以 #ifndef 條件成立,然後 #define MYHEADER_H 定義了這個宏。 當同一個 header 再次被包含時,MYHEADER_H 已經被定義, 所以 #ifndef 條件失敗,header 的內容將被忽略。
使用 Include Guard 可以確保 header 只被包含一次,從而避免了重複定義和衝突。 這對於確保程式的正確性和可移植性至關重要。 因此,建議在所有的 header 中都使用 Include Guard 技術,包括 DLL export 的 header。
#pragma once
#pragma once 這和上述寫三行的 include guard 一模一樣。
後來各家 complier 也發現這個問題,所以支援 #pragma once 讓 程式語法更精簡。
大多數主流的 C++ 編譯器都支援 #pragma once,包括但不限於:
- GCC(GNU 編譯器套件)
- Clang(LLVM 編譯器基礎架構)
- Microsoft Visual C++
- Intel C++ 編譯器
然而,也有少數編譯器可能不支援或者支援程度有限。因此,如果需要確保代碼的可移植性,建議仍然使用傳統的 include guard。
好拉,希望有幫助到你/妳。
