關於標頭檔案保護和變數重複定義的一點理解

2021-08-10 06:22:03 字數 431 閱讀 9189

之前一直都有乙個困惑:既然標頭檔案一般都有避免重複編譯的預編譯條件保護,那為什麼在標頭檔案中定義全域性變數就會出現重複定義的錯誤呢?這個困惑持續了很久,一直到最近才算大概理解。現記錄於此,也許理解的不正確,希望不吝指正。

所謂標頭檔案保護,指的是通過對巨集的檢測,來達到避免重複編譯的目的。比如:#ifndef  my_head_file   #define my_head_file   #endif,或是vs裡面的 #pragma once。這樣做的目的就是能夠保證標頭檔案只會被編譯一次,而不論其被包含多少次。

我們都知道,只要我們在原始檔中#include了某個標頭檔案,該標頭檔案的內容就會被複製到該處,也就是說會在編譯後的檔案中將該標頭檔案對應的編譯部分複製到此處,也就是說,不會再重新編譯該標頭檔案,這樣自然也就保證了標頭檔案的重複編譯。

編譯是很花時間的,如果是相互包含,且不加標頭檔案保護的話,則會嵌入迴圈編譯。

避免變數重複定義和重複包含標頭檔案的方法

重複包含的影響 在預處理對時候,include相同的檔案,預處理器會檢查 是否有定義再決定要不要複製內容,重複包含會是編譯器多檢查幾次而已。另外在使用增量編譯的時候,這個檔案變化,所有 include 這個檔案的檔案都需要重新編譯,即使沒有去使用裡面的任何內容。避免方法 1.把頭檔案放在巨集裡 if...

避免標頭檔案重複引入和重複定義

使用預編譯指令,常用的預編譯指令如下 條件編譯 define 巨集定義 undef 取消巨集 include 文字包含 ifdef 如果巨集被定義就進行編譯 if defined 與ifdefine的區別在於可以可以組成複雜的判別條件 ifndef 如果巨集未被定義就進行編譯 if defined ...

ifndef 標頭檔案重複定義

ifndef只能保證重複包含時,只包含一次。但snake.cpp和main.cpp是分別進行編譯的,snake.cpp裡的 define對於main.cpp不起作用。也就是說在編譯main.cpp時,snake.h是第一次包含,因此又有乙個ch,相互鏈結時就會發現重定義。正確的作法應該這樣 1 在s...