重複包含的影響:在預處理對時候,include相同的檔案,預處理器會檢查***是否有定義再決定要不要複製內容,重複包含會是編譯器多檢查幾次而已。另外在使用增量編譯的時候,這個檔案變化,所有 include 這個檔案的檔案都需要重新編譯,即使沒有去使用裡面的任何內容。
避免方法:
1.把頭檔案放在巨集裡:
#ifndef 標誌(
這個標誌本來可以隨便自己定義,但是為了防止混亂,所以一般都會採用自己的檔案名字:__wenjian_h__)
#define 標誌
//檔案內容
#endif
在標頭檔案定義前面新增
#pragma once (不太通用)
就可以防止乙個標頭檔案被多次包含,進而防止重複定義的錯誤。
在用vc6.0嚮導生成的標頭檔案中,經常可以看見如下的**段:
#if !defined(afx_resizablelayout_h__included_)
#define afx_resizablelayout_h__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
...
#endif // !defined(afx_resizablelayout_h__included_)
對於巨集有基本了解的朋友應該都知道,標頭檔案中如下的巨集定義,是為了避免同樣的標頭檔案在同乙個.c檔案或者.cpp檔案多次包含。
#if !defined(***)
#define ***
#endif
這很好理解,但接下來的一段,尤其是#pragma once的意思,我就不是很清楚了。從msdn得到pragma once的解釋是:
"specifies that the file will be included (opened) only once by thecompiler when compiling a source code file."
英文注釋的大意也是說#pragma once是為了避免檔案重複包含。疑惑就此產生了,既然巨集"#if !defined"已經有這個作用了,為何還要乙個"#pragma once"呢? 我接著在網上搜到了幾份答案,但大家的回答都很模糊,於是我想放棄,不再想這個問題,但還是不太甘心,就接著看了看別人的解釋。突然間,好像靈犀一點,開竅了。雖然"#if !define"和"#pragma once"都有避免重複包含的功能,但是在實現上還是有區別的。舉一例如下:
// test1.h
#if !define (__testone_h_)
#define __testone_h_
...
#endif
// test2.h
#pragma once
...
// test.cpp
#include "test1.h" // line 1
#include "test1.h" // line 2
#include "test2.h" // line 3
#include "test2.h" // line 4
...
標頭檔案test1.h中用巨集來避免重複,標頭檔案test2.h中用#pragma once來避免重複。編譯test.cpp,將需要開啟test1.h兩次,第一次發現巨集__testone_h_沒有定義,接著就處理巨集定義;第二次開啟test1.h時,發現巨集__testone_h_已經定義過了,編譯器就會略過巨集定義部分,知道處理完test1.h末尾的#endif。
而由於標頭檔案test2.h使用#pragma once來避免重複定義的,在編譯test.cpp的過程中,test2.h只會被開啟一次,也就是處理到第3行的時候。因為test2.h用的是#pragma once,所以在處理完第3行後,編譯器已經知道包含了一次test2.h,在它(編譯器)處理第4行**時,發現test2.h已經包含過了,忽略掉第 4行**,也就不需要再次開啟test2.h進行判斷了。
總結一下,除了#pragma once是微軟編譯器所特有的之外,用巨集和#pragma once的辦法來避免重複包含標頭檔案,主要區別在於巨集處理的方法會多次開啟同一標頭檔案,而#pragma once則不會重複開啟,從而#pragma once能夠更快速。
避免標頭檔案重複引入和重複定義
使用預編譯指令,常用的預編譯指令如下 條件編譯 define 巨集定義 undef 取消巨集 include 文字包含 ifdef 如果巨集被定義就進行編譯 if defined 與ifdefine的區別在於可以可以組成複雜的判別條件 ifndef 如果巨集未被定義就進行編譯 if defined ...
C 避免重複包含標頭檔案方法
為了避免同乙個標頭檔案被包含 include 多次,c c 中有兩種巨集實現方式 一種是 ifndef方式 另一種是 pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別。但兩者仍然有一些細微的區別。方式一 ifndefsomefile h definesomefile ...
在C 中定義全域性變數時避免重複定義
問題 如何在c 中定義全域性變數時避免重複定義呢?今天遇到問題,全域性變數重定義錯誤,印象中記得要加extern,但是怎麼都不對,找資料後得到了解決方案,記之。參考文獻 解決方案 只要在定義時盡量在.cpp檔案中進行,而不要在.h 檔案中定義。定義好了之後,可以在.h檔案中利用extern關鍵字進行...