C語言頭文件避免重復包含的方法技巧

C語言頭文件避免重復包含的方法技巧

假定有以下幾個頭文件及其包含關系為: File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp 那么:file3.h包含file1.h,file2.h,file4.h包含file1.h,file2.h,file5.h包含file3.h,file4.h。如許就會導致在file5中對file1和file2的反復包含,編譯時就會報錯。

關于頭文件重復包含問題

重復包含的影響:在預處理對時候,include相同的文件,預處理器會檢查XXX是否有定義再決定要不要**內容,重復包含會是編譯器多檢查幾次而已。另外在使用增量編譯的時候,這個文件變化,所有include這個文件的文件都需要重新編譯,即使沒有去使用里面的任何內容。

避免方法:1.把頭文件放在宏里:#ifndef標志(這個標志本來可以隨便自己定義,但是為了防止混亂百科,所以一般都會采用自己的文件名字:__WENJIAN_H__)#define標志//文件內容#endif在頭文件定義前面添加#pragmaonce(不太通用)就可以防止一個頭文件被多次包含,進而防止重復定義的錯誤。

在用VC6.0向導生成的頭文件中,經(jīng)??梢钥匆娙缦碌拇a段:#if!defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)#defineAFX_RESIZABLELAYOUT_H__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000…#endif//!defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)對于宏有基本了解的朋友應該都知道,頭文件中如下的宏定義,是為了避免同樣的頭文件在同一個.C文件或者.CPP文件多次包含。#if!defined(XXX)#defineXXX#endif這很好理解,但接下來的一段,尤其是#pragmaonce的意思,我就不是很清楚了。從MSDN得到pragmaonce的解釋是:\”Specifiesthatthefilewillbeincluded(opened)onlyoncebythecompilerwhencompilingasourcecodefile.\”英文注釋的大意也是說#pragmaonce是為了避免文件重復包含。疑惑就此產生了,既然宏\”#if!defined\”已經(jīng)有這個作用了,為何還要一個\”#pragmaonce\”呢?我接著在網(wǎng)上搜到了幾份答案,但大家的回答都很模糊,于是我想放棄,不再想這個問題,但還是不太甘心,就接著看了看別人的解釋。

突然間,好像靈犀一點,開竅了。雖然\”#if!define\”和\”#pragmaonce\”都有避免重復包含的功能,但是在實現(xiàn)上還是有區(qū)別的。舉一例如下://Test1.h#if!define(__TESTONE_H_)#define__TESTONE_H_…#endif//Test2.h#pragmaonce…//Test.cpp#include\”Test1.h\”//line1#include\”Test1.h\”//line2#include\”Test2.h\”//line3#include\”Test2.h\”//line4…頭文件Test1.h中用宏來避免重復,頭文件Test2.h中用#pragmaonce來避免重復。

編譯Test.cpp,將需要打開Test1.h兩次,**次發(fā)現(xiàn)宏__TESTONE_H_沒有定義,接著就處理宏定義;第二次打開Test1.h時,發(fā)現(xiàn)宏__TESTONE_H_已經(jīng)定義過了,編譯器就會略過宏定義部分,知道處理完Test1.h末尾的#endif。而由于頭文件Test2.h使用#pragmaonce來避免重復定義的,在編譯Test.cpp的過程中,Test2.h只會被打開一次,也就是處理到第3行的時候。因為Test2.h用的是#pragmaonce,所以在處理完第3行后,編譯器已經(jīng)知道包含了一次Test2.h,在它(編譯器)處理第4行代碼時,發(fā)現(xiàn)Test2.h已經(jīng)包含過了,忽略掉第4行代碼,也就不需要再次打開Test2.h進行判斷了。

總結一下,除了#pragmaonce是微軟編譯器所特有的之外,用宏和#pragmaonce的辦法來避免重復包含頭文件,主要區(qū)別在于宏處理的方**多次打開同一頭文件,而#pragmaonce則不會重復打開,從而#pragmaonce能夠更快速。

頭文件被多次包含是什么意思?

頭文件被多次包含是:如有一個大型程序,為了提高可讀性,程序員是分多個文件編寫,不會寫在一個文件中的,這樣的話程序員把每個文件都包含到主程序所在的文件中,不能多次包含,否則會出現(xiàn)編譯出錯?。?!但是庫文件的話可以多次包含,因為庫文件中預編譯命令。預編譯命令是看條件編譯,如果條件成立編譯,否則不編譯,也就是你編譯一個文件時已經(jīng)編譯過這個頭文件,再編譯另一個文件時不會再編譯那條頭文件。

c語言如何避免重復包含頭文件?

#include 通常不會包含 .cpp 文件,如果包含的話,一般僅會包含如 static 的函數(shù)這樣不會因為多次包含而導致鏈接問題的。為了防止重復包含,頭文件中都會有相應的處理,比如加上#ifndef _STDIO_H_#define _STDIO_H_// 真正的頭文件內容#endif這樣在多次包含的時候,因為已經(jīng)定義了 _STDIO_H_,所以第二次包含的內容會被忽略。

比較新的 C++ 編譯器也支持 #pragma once,這樣只要在頭文件開頭寫上這一句,編譯器就會在處理頭文件的時候不包含多次了。

C語言 頭文件重復包含問題 inndef 怎么用?

#ifndef BASE_H//如果沒有定義過 BASE_H ,就編譯下面的代碼#define BASE_H//定義這個宏#endif 在每一個.h文件,都使用這個編譯指令。即使多次 #include,也不會重復包含。

有關C++頭文件重復的問題

誰說重復包含就報錯。

重復包含幾百次也不是什么錯, 如果有錯,錯在里面的東西不可以重復出現(xiàn)多次, 而這里里面的東西重復出現(xiàn)是語法允許的, 所以當然不會有什么錯include**意義就是吧那個文件的內容替換到這個位置來,沒別的講究 顯然我說的“東西”不是頭文件, 而是C語言的語法結構。

首先你要搞清一個概念, #include是編譯預處理的語法結構, 而不是C語言的。 C語法本身并不知道#include的存在,所以它也不會在意你include多少次。 他在意的是, 比如如果你頭文件里有一個變量定義: int a =10; 那么當你include這個頭文件多次展開后就定義了這個變量多次, 這當然就違反C的語法規(guī)則。 所以是否可以include多次這個問題不在于include本身而在于展開后的結果是不是能接受。

現(xiàn)在所有標準頭文件都可以重復include而不會產生不良影響。 自己寫的頭文件在vc下可以**句加上#pragma once也就可以重復include。 別的頭文件只能說看情況。