2011-08-26 282 views
11

什麼是使用stdafx.h適當方式,在分離的依賴方面?如何正確使用stdafx.h?

如果我把一切在那裏,然後我編譯的速度極快,而我需要的任何文件說的是

#include "stdafx.h" 

與告誡說:

  1. 我沒有知道哪些文件取決於哪些頭文件。
  2. 它降低了模塊性,使我的代碼更少重複使用。
  3. 我不能再將C #include從C++中分離出來(例如,cstringstring.h),而沒有很大的痛苦。 (說到這,這是否即使有關係嗎?)

如果我把什麼在那裏,我能很好地組織一切 - 但後來我編譯大幅放緩。

如果我把一切包括在我的個人文件的時間間隔頭,然後我得到兩全其美的,與現在我要跟蹤的同步問題的警告。

這個問題是否有一個衆所周知的/廣爲接受的解決方案?

回答

13

你不應該把自己的頭文件中stdafx.h,因爲你的代碼可能會改變,並會導致您的整個程序重新編譯。

我通常把標準的頭文件和庫等在那裏,如所有boost包括。

+0

同意。把事情放在預編譯的頭文件中,你不會在該項目的範圍內觸及。 –

+0

我不知道這是如何相關。我*仍*不知道哪些源文件取決於哪些頭文件(我是否真的需要在每個文件中間接地包含#include ?),即使它們是系統頭文件。所以它會*仍然是非模塊化的。 – Mehrdad

+3

@Mehrdad,這是具有預編譯頭文件的妥協之一。 – Marlon

4

當使用預編譯的頭,你要確保你的項目完全編譯即使沒有PCH存在(所以把它作爲優化,不包括在每一個TU更換)。除此之外,不要把所有東西放在那裏(更重要的是,千萬不要把你自己項目的頭文件--PCH應該只包含那些不會改變或很少改變的東西 - 系統庫,外部依賴項),而是試圖保持預編譯最常用/最大的東西。

1

就個人而言,我寧願有比沒有想法(知名度)的編譯速度較慢的依賴是如何。然而,一切都是有限的。

由於每個項目都有自己的預編譯的頭文件,所以我只是把常見到所有包含在裏面。假如一個項目使用了一些增強頭文件,那麼這些頭文件就可以很好地適用於整個項目,並且不會改變它們。因此,在系統或第三方等預編譯頭文件中很少/永遠不會更改頭文件。

對於編譯速度,我寧願儘可能地依賴前向聲明,分成更小的庫,並嘗試查看是否可以以易失代碼不影響其他重編譯的方式組織事物碼。

1

Yor編譯器可能有一個「show includes」標誌。打開它並查找重複的深層嵌套層次結構。考慮在每個這樣的深層樹中包含一個最淺的include文件。

0

有條件包括PCH的,然後定義類似「的#define _PRE_COMPILE_」 這樣,原來的標題是仍然可見,該代碼是模塊化的,如果你因此需要。這方面的一個例子是包括

#ifdef _PRE_COMPILE_ 
#include "stdafx.h" 
#elif 
#include <iostream> 
#include <cstring> 
#endif 

包括這在每個源文件的開始。

+0

的PCH。由於Microsoft的PCH實現工作方式,在'#include「stdafx.h」'之前有一個'#ifdef'不起作用。 –