![](/img/trans.png)
[英]C++ Including Visual Studio header files in Qt project. <xstring> include error
[英]Including header files in Visual Studio
假設我有3個項目X
, Y
和E
的解決方案。
E
將生成可執行文件, X
和Y
將生成靜態庫,以使Y
包括X
的頭文件,而E
包括Y
的頭文件。
現在,我的問題是: 為什么我必須在E
包括X
的頭文件目錄?
原因如下:
Y
中的某些函數可能會采用X
聲明的類型的參數(或返回值)。 E
創建這些參數(或返回值)對象。 E
中絕對需要X
頭文件。 有時可以為C ++重組頭文件以使用前向聲明來避免您描述的情況。 這是一個示例: C ++標頭依賴技巧 。
一個簡單的例子:
class X {
//...
};
// #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
//...
};
#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.