為什麼一個文件被包含兩次編譯
❶ linux同一個軟體包編譯兩次,第二次會覆蓋第一次嗎
不一定,如果make的話,一般源碼沒變化就不會重新編譯,想要重新編譯最好先把執行碼和.o刪除
❷ 頭文件被多次包含是什麼意思
頭文件被多次包含是:如有一個大型程序,為了提高可讀性,程序員是分多個文件編寫,不會寫在一個文件中的,這樣的話程序員把每個文件都包含到主程序所在的文件中,不能多次包含,否則會出現編譯出錯!!!
但是庫文件的話可以多次包含,因為庫文件中預編譯命令。預編譯命令是看條件編譯,如果條件成立編譯,否則不編譯,也就是你編譯一個文件時已經編譯過這個頭文件,再編譯另一個文件時不會再編譯那條頭文件。
❸ C++一個文件中含有兩個預編譯頭文件的程序怎麼寫
防止重復包含的宏是在被調用的頭文件內寫的,而不是在調用的文件。你這么定義後,那兩個被包含的頭文件就失效了。
❹ 頭文件被重復包含有什麼壞處頭文件被循環包含有什麼壞處
有些頭文件重復包含只是增加了編譯工作的工作量,不會引起太大的問題,僅僅是編譯效率低一些
有些頭文件重復包含,會引起錯誤,比如在頭文件中定義了全局變數(雖然這種方式不被推薦,但確實是C規范允許的)
如果頭文件被循環包含的話,那就看你的編譯器了
有的會智能處理,和只include一次一樣
有的會報錯
有的乾脆死鎖,導致編譯程序崩潰(這個 只有很低級的編譯器才會出 現在幾乎看不到了)
不管怎樣,用ifnde xxx #define xxx或者其他方式避免頭文件重復包含,只有好處 沒有壞處
是一個很好的習慣
❺ 在c/c++中如何避免頭文件被多次包含
頭文件的最開始
加入這條雜注,就能夠保證頭文件只被編譯一次。
#pragma once是編譯器相關的
,就是說即使這個編譯系統上有效,但在其他編譯系統也不一定可以,不過現在基本上已經是每個編譯器都有這個雜注了。
#ifndef,#define,#endif是C/C++語言中的宏定義,通過宏定義避免文件多次編譯。所以在所有支持C++語言的編譯器上都是有效的,如果寫的程序要跨平台,最好使用這種方式具體寫法方式一:#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... // 一些聲明語句#endif方式二:#pragma once
... ... // 一些聲明語句比較#ifndef的方式依賴於宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心「撞車」,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個文件不會被包含多次。
注意這里所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件
。帶來的好處是,你不必再費勁想個宏名了,當然也就不會出現宏名碰撞引發的奇怪問題。對應的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復包含。當然,相比宏名碰撞引發的「找不到聲明」的問題,重復包含更容易被發現並修正。
方式一由語言支持所以移植性好,方式二 可以避免名字沖突
我還看到一種用法是把兩者放在一起的:
#pragma once
#ifndef __SOMEFILE_H__
... ... // 一些聲明語句#endif看起來似乎是想兼有兩者的優點。
❻ 一個頭文件被包含兩次,而能通過編譯,為什麼
頭文件中有頭文件「守衛」,防止你多次包含的吧
❼ 一個頭文件被同一個源文件多次包含,會發生什麼情況
假如頭文件裡面沒有加入
#ifndef GRAPHICS_H
#define GRAPHICS_H
。。。。。。。。//內容
#endif
,可能會導致內容的重新定義的錯誤
❽ 如何避免頭文件被重復包含
#include文件的一個不利之處在於一個頭文件可能會被多次包含,為了說明這種錯誤,考慮下面的代碼:
#include "x.h"
#include "x.h"
顯然,這里文件x.h被包含了兩次,沒有人會故意編寫這樣的代碼。但是下面的代碼:
#include "a.h"
#include "b.h"
看上去沒什麼問題。如果a.h和b.h都包含了一個頭文件x.h。那麼x.h在此也同樣被包含了兩次,只不過它的形式不是那麼明顯而已。
多重包含在絕大多數情況下出現在大型程序中,它往往需要使用很多頭文件,因此要發現重復包含並不容易。要解決這個問題,我們可以使用條件編譯。如果所有的頭文件都像下面這樣編寫:
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
...//(頭文件內容)
#endif
那麼多重包含的危險就被消除了。當頭文件第一次被包含時,它被正常處理,符號_HEADERNAME_H被定義為1。如果頭文件被再次包含,通過條件編譯,它的內容被忽略。符號_HEADERNAME_H按照被包含頭文件的文件名進行取名,以避免由於其他頭文件使用相同的符號而引起的沖突。
但是,你必須記住預處理器仍將整個頭文件讀入,即使這個頭文件所有內容將被忽略。由於這種處理將托慢編譯速度,所以如果可能,應該避免出現多重包含。
❾ C++ 一個含有靜態全局變數的頭文件被包含多次
在對一個變數聲明了static之後這個變數只能在當前文件中起作用了,你在頭文件裡面聲明了,那麼第一個包含這個頭文件的源文件就是這個static變數的作用域了,第二個包含頭文件的源文件就是這個變數的第二個作用域,當然也就不一樣了。
至於你需要一個全局變數,你可以聲明extern,但是要注意在頭文件中只能聲明,要在cpp文件中再定義一次。這樣包含了這個頭文件的源文件都能共享同一個全局變數了。不過c++最好的全局變數是類中static。
❿ C++ 中,包含一個有命名空間的文件兩次會發生錯誤
你把一個全局變數的申明放到了頭文件裡面,你因該在a.cpp裡面申明
namespacea
{
intaa;
}
然後在 a.h裡面申明
namespacea{
externintaa;
}
並且a.cpp中不再include頭文件a.h