Home C++ 引用防護(中文)
Post
Cancel

C++ 引用防護(中文)

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,包括但不限於:

  1. GCC(GNU 編譯器套件)
  2. Clang(LLVM 編譯器基礎架構)
  3. Microsoft Visual C++
  4. Intel C++ 編譯器

然而,也有少數編譯器可能不支援或者支援程度有限。因此,如果需要確保代碼的可移植性,建議仍然使用傳統的 include guard。

好拉,希望有幫助到你/妳。

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍

C++ Include Guard(English)

Item 9 - constexpr (中文)