2016-06-13 54 views
2

我想避免這種情況的警告或錯誤:可以買到不包含頭文件目錄

h1.hpp:

#include <vector> 
//some code 

main.cpp中:

#include "h1.hpp" 
//#include <vector> This include is commented. 
int main(){ 
    std::vector<int> x; //works fine! 
} 

我想得到一個錯誤/警告,我正在使用<vector>,但它不直接包含在MSVS中。

+1

那真的不是預處理器的工作原理。如果頭文件包含在任何地方。 –

+0

就編譯器而言,包含在main.cpp中,因爲預處理器從h1.hpp中添加它,所以編譯器不會知道差別....所以需要在預編譯器處理器的時間(或之前)...不知道這是可能的.... –

+0

@JoachimPileborg是的,我知道沒有錯。但我希望編譯器能夠告訴我它不是直接包含在更深層次的。它可能是一個靜態分析工具的工作。但是,我在問是否可以由編譯器自己完成。 –

回答

-1

如果使用<vector>作爲實現細節(即函數體),請將h1.hpp分隔爲h1_head.hpp(聲明)和h1_body.hpp(定義)。如果你有結構/類,你可以通過例如隱藏細節。在你的類中聲明一個detail結構/類,並只在h1_body.hpp中定義它。包含h1_head.hpp之前的main.cpp代碼和h2_body.hpp 之後的所有代碼。

如果任何h1.hpp的fuctions的採取/返回向量或相關類型,那麼也許這是最好的假設,包括main.cpp的H1時<vector>。一個替代方案是說h1 需要一個向量類,因此不包括h1中的<vector>,但要求將它包含在main.cpp中(在h1之前) - 但這是非常令人困惑的,因爲沒有編程方式的記錄它(不,要求typedef std::vector vector_t;#define H1VECTOR std::vector不記錄,這是錯誤的概括)。

+0

hmm ....其他然後這個答案沒什麼意義(或者我沒有足夠的理解它),你將如何測試'如果h1.hpp中的任何函數在編譯期間取/返向量'時間併產生警告? - 這是OP的要求:) –

+0

請詳細說明哪一部分對您沒有意義,以便我可以爲您和其他讀者進行描述/編輯。是的,答案是基於用戶控制h1.hpp的先決條件。請注意,無論是否有任何函數使用/返回矢量,第一段中的方法都成立。這顯然不是OP所要求的,OP想知道''是由於h1.hpp還是在main.cpp中。我仍然認爲1.我的解決方案在''不在h1.hpp的界面上時會工作,並且如果它在界面上,那麼你必須包含h1.hpp。 – lorro

+0

但是你能解釋一下如果在main中被使用會產生一個錯誤/警告。cpp什麼時候(並且只有當它)被間接包括在內時。 –