2009-08-25 76 views
4

預處理程序是否有辦法檢測當前 翻譯單元中的代碼是否使用(或正在創建)預編譯頭文件?

---
我現在面臨的實際問題是,我在 項目中通過預編譯幾乎所有頭文件來濫用PCH。
這意味着沒有任何 可以從#includes獲得清除依賴關係管理,編譯時間也很糟糕。 實際上,每次更改都會觸發完全重建。
該應用程序是一個很大的方法,只是一次性修復它,一些老傢伙拒絕 ,以相信預編譯每一個都是不好的。我將不得不首先證明它。
所以我必須一步一步做,並確保我的更改不會影響編譯舊PCH方式的 代碼。
我的計劃是如果在PCH.h中找不到PCH.h,並且在有空的時候處理非PCH版本。檢測預編譯頭文件

#ifdef USES_PCH 
#include "PCH.h" 
#elif 
// include only whats needed 
#endif 

我想,以避免在命令行定義USES_PCH和手動不是很優雅與/ Y保持在 同步的是,除此之外,將是一個痛苦。有很多配置 和模塊來跟隨和許多不遵循項目默認值的文件。

+0

當然預處理器已經知道它是否應該是生成或使用預編譯頭。它不需要檢測任何東西。你是否想要問是否正在處理的*代碼可以檢測到它,就像使用一些'ifdef'命令一樣? – 2009-08-25 12:45:41

+0

是的,我想做一個#ifdef __USES_PCH或類似的東西 – grimner 2009-08-25 13:26:34

+0

你想解決這個問題的實際問題是什麼? – peterchen 2009-08-27 03:58:27

回答

1

據我所知,它不能,但也有一些啓發:VC++使用StdAfx.h中,Borland公司使用的#pragma hdrstop會等

+0

如果您使用默認項目設置,VC++只使用StdAfx.h,您可以隨時更改它。 – 2009-08-25 10:30:54

+0

對於我來說,我改變它爲每個vcproj獨特的東西,但我期望許多項目只是與默認值。 – rpg 2009-08-25 10:43:19

3

如果++定義的常量的Visual C指示是否預編譯頭正在使用中,它可能會在Predefined Macros中列出。它沒有記錄在那裏,所以它可能不存在。 (如果它確實存在,它可能沒有文檔,並可能在未來的版本中更改。)

+0

是的,我知道這不是官方的宏。如果有一個我不會問這裏。 我希望有人知道一些間接的方法來解決它無論如何。 – grimner 2009-08-27 16:22:05

3

在Visual C++中使用預編譯頭文件時,這不起作用,甚至在包含預編譯頭文件之前甚至無法使用任何代碼。當我遇到你的問題時,我試圖做類似的事情。經過一些試驗和錯誤之後,我發現在使用/ Yu編譯器選項時,在預編譯頭文件的#include指令之前不會有任何代碼。

#ifdef USES_PCH 
#include "stdafx.h" 
#endif 

結果:致命錯誤C1020:意外#ENDIF

+0

我正要試試這個好,那麼不要那麼:) thx – n00b 2012-10-13 17:48:18

+0

我認爲在預編譯頭之前#ifdef在VS2015中工作。 – ShitalShah 2017-02-12 08:52:32

+0

@ShitalShah,它在VS2015中不適用於我。上述代碼在文件設置爲使用PCH(/ Yu選項)時仍會產生C1020錯誤。 – Matthew 2017-02-13 20:13:43