簡體   English   中英

包括頭文件與實現文件(C ++)中的文件

[英]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文件是實現。

我們用:

  • 當lib / h文件在lib文件夾中可用時, #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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM