簡體   English   中英

在Visual Studio中包括頭文件

[英]Including header files in Visual Studio

假設我有3個項目XYE的解決方案。

E將生成可執行文件, XY將生成靜態庫,以使Y包括X的頭文件,而E包括Y的頭文件。

現在,我的問題是: 為什么我必須在E包括X的頭文件目錄?

原因如下:

  1. 項目Y中的某些函數可能會采用X聲明的類型的參數(或返回值)。
  2. 如果是這樣,編譯器可能必須在編譯E創建這些參數(或返回值)對象。
  3. 如果是這樣,則E中絕對需要X頭文件。

有時可以為C ++重組頭文件以使用前向聲明來避免您描述的情況。 這是一個示例: C ++標頭依賴技巧

一個簡單的例子:

h

class X {
  //...
};

h

// #include <X.h> -- remove this
class X; // add forward declaration
class Y {
  X *m_px; // must be a pointer, not a value,
           // otherwise the size of X would need to be known
  //...
};

pp

#include <X.h> // need to add it here
//...

如果構造Y以完全封裝對X的依賴關系,則可以避免這種情況。 根據X和Y的具體情況,這可能實現或不可能實現。但是,如果Y向E展示的接口不需要在其中包含X的任何細節,那么E項目甚至不需要間接包括在稀疏情況下,僅Y的實現文件(.c或.cpp文件)將包括X的頭。在Y頭中對X中的類型使用前向聲明可以幫助實現X在Y中的封裝。

這是一個很好的目標,但並非總是可能的,即使有可能比您(或您的管理層)想要付出的努力更多。

簡短的答案: “為什么我必須在E中包含X的頭文件的目錄?” ...您不應該這樣做。 Y的客戶不必知道Y取決於X。


長答案:僅當Y的接口(簽名)使用X的標頭中聲明的內容時,才需要在E中包括X的標頭。但是,如果Y的標頭是“適當構造的”,則它們將包括X標頭包含在Y標頭本身中,而您不必在E中明確包含X標頭(包括Y標頭將自動包含X標頭)。

“正確構建”的意思是,如果Y中Y1.h中的簽名依賴於(例如)X3.h和X7.h,則Y1.h應該包括那些文件(直接或間接)。 這樣,Y1.h的任何客戶端都不必知道其依賴項是什么,因此不必分別包含這些依賴項。 作為一個簡單的測試,由以下幾行組成的.cpp應該可以正常編譯:

#include "Y1.h"

一個好的做法是在Y1.cpp中包含任何其他文件之前,先#include“ Y1.h”。 如果Y1.h缺少依賴項,則編譯器會通知您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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