2011-11-18 35 views
2

因此,我試圖處理各種版本的Windows SDK中的小差異,但是在編譯期間無法確切地確定我正在構建的Windows SDK的版本C++。包含可能存在或不存在於Windows上的頭文件

從Windows SDK版本6.1起,有一個WinSDKVer.h文件,其中包含一些版本信息,可用於確定正在使用哪個版本的SDK,即使它不包含直接版本號SDK。但是,6.0A不包含這個頭文件,所以只需插入#include,然後使用類似#ifdef的東西就行不通了,因爲環境中沒有WinSDKVer.h。

我的一位同事對在Windows上包含頭文件的方式有一個模糊的回憶,當且僅當它存在但不記得任何細節時,我至今未能找到任何有關在計算器上執行此操作的信息或互聯網。

我已經完成了我的工作流程,試圖強制使用6.1或更高版本的SDK(如果安裝在開發人員的機器上),但如果其他人遇到了這種普通類型的問題,問題之前和如果/他們如何解決它。

任何想法?

+0

http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx –

回答

4

(難看)創建自己的空白版本的頭文件並將其放在一個文件夾中。然後將這個文件夾最後添加到包含目錄中。如果該文件存在於SDK中,它將被包含;否則你的文件將被使用。

+0

是的,我認爲這可能是要走的路。謝謝! –

3

你不能在C++級別上做到這一點。您可以在構建系統級別上執行此操作 - 例如在SCons見"Checking for the Existence of Header Files"。基本思想是編譯一個只包含文件的小程序,看看編譯是成功還是失敗。然後,你可以設置一個宏,說如果你有頭,或不是,並做

#ifdef HAVE_WINSDKVER_H 
# include <winsdkver.h> 
#endif 

或其他。

0

通過歷史版本的SDK標題進行一些探索,尋找所有版本的SDK中都存在的頭文件,但在其不同版本的SDK中包含其#defines中的微妙變體。您可以使用#ifdef來測試這些以區分SDK。

顯然它必須是一些文件,而不是WinSDKVer.h,在某些情況下,您可能需要幾個文件的組合。

很多年前我做過something similar for Palm OS SDKs

+0

這種方法的缺點是,如果定義來回變化,最終可能會失敗。儘管如此,我仍然可以看到它足夠完成手頭的任務。 –

+0

@Johntonsoup:不是。現有SDK的性質是它們不再改變;未來SDK的本質是它們包含_WinSDKVer.h_ - 您只需在不影響6.1之前版本SDK的使用的前提下進行操作。 –