[英]including files in header vs implementation file (C++)
在頭文件中包含頭文件與在實現文件中包含頭文件有什么區別?
這個
例如:
// test.h
#include"globals.h"
class Test
{
Test();
};
VS
//test.cpp
#include"globals.h"
Test::Test()
{
}
一般原則是您希望在合理可能的情況下最小化依賴性,因此:
如果您的接口 (.h)引用給定標頭中的任何內容,則該標頭需要在接口中包含#include(.h)
如果你只在你的實現 (.cpp)中引用一個給定的頭文件(而不是在你的界面中)那么你應該只在執行中#include那個頭文件
您還應該嘗試僅#include實際需要的標頭,盡管在大型項目的生命周期中這可能很難維護
因此,對於上面的示例,如果您沒有在test.h中引用globals.h中的任何內容,但是您確實在test.cpp中引用了它,那么#include應該放在test.cpp中。 如果你在test.h中引用了globals.h中的任何東西,那么你需要在test.h中使用#include。
如果要包含一些特定於實現的外部標頭,則最好將它們包含在cpp文件中以減少API文件的標頭依賴性。 在cpp文件中包含第三方標題是數據隱藏的好方法,因此庫用戶不會對您的引用了解太多。
最好將頭文件包含在需要它們的位置,以提高代碼的合格性,並使您的項目可以輕松修改以供將來開發。
沒有區別。 .h
文件用於定義類和變量,而.cpp
文件是實現。
我們用:
#include <>
。 #include ""
當它出現在當前文件夾中時..(未給出lib路徑) 唯一編譯的是.cpp
文件。
實際上,這不是真的,編譯了從.cpp
生成的文件。
生成此其他文件時, #include
指令有效地將包含文件的內容復制並粘貼到生成的文件中。
這就是發生的一切。
據我所知,在源文件或頭文件中包含頭文件沒有任何區別。 請注意,#include是一個預處理器宏,它所做的就是它將頭文件的內容替換為包含它的位置。
在上面的示例中,如果globals.h看起來像這樣,
#ifndef GLOBALS_H_
#define GLOBALS_H_
#define MYGLOBAL_VARIABLE 10
#endif /* GLOBALS_H_ */
預處理器完成其工作后的源文件將如下所示。
/* #include "globals.h" */
#ifndef GLOBALS_H_
#define GLOBALS_H_
#define MYGLOBAL_VARIABLE 10
#endif /* GLOBALS_H_ */
Test::Test()
{
}
#include
是一個簡單的文本替換。 該行由所述文件的內容替換。 所以,如果你在Bh中包含Ah,而在C.cpp中包含Bh,那么Ah的內容最終將被粘貼到C.cpp中。
我們通常會嘗試避免使用此類標頭。 通常可以使用前向聲明。 例如class Global;
。 基類是一個很大的例外。 定義派生類的標頭必須包含基類的標頭。
如果您以Headers和Library的形式提供代碼作為API,那么您必須確保頭文件中沒有包含定義接口的內部私有頭文件。 在這種情況下,您將所有私有文件包含在CPP文件中,這些文件將被編譯,並將在.lib或.a或.dylib文件中。 否則,對於使用您的API的用戶來說這將是一個問題。
您應該確保標題中包含的文件說globals.h可以在包含test.h的地方訪問。 如果不是這種情況,那么在CPP文件中包含globals.h。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.