作者:zyl910
從VS2010開始,提供了一個平臺工作集(Platform ToolSet)選項用于配制vc編譯版本。到了VS2012,更是因為默認平臺工具集不支持WindowsXP,導致經常需要切換到xp版平臺工具集,VS2013也是如此。在某些時候,我們需要使用條件編譯判斷平臺工具集的版本去做不同的操作,而VS中沒有提供一個標準的檢測辦法。本文就是我的一些心得。
在設置了平臺工作集后,環境變量宏會發生變換,而且“VC++目錄”、“預處理器定義”等地方也會發生一些變化。
以VS2013為例,注意觀察“Visual Stdio 2013 (v120)”、“Visual Stdio 2013 - Windows XP (v120_xp)”的區別。
先看“C/C++” ->“預處理器” ->“預處理器定義”與平臺相關的環境變量宏:
當平臺工具集設為“Visual Stdio 2013 (v120)”時,$(PlatformToolset)為“v120”,$(PlatformToolsetVersion)為“120”。
當平臺工具集設為“Visual Stdio 2013 - Windows XP (v120_xp)”時,$(PlatformToolset)為“v120_xp”,$(PlatformToolsetVersion)為“120”,而“繼承的值”中多了一項“_USING_V110_SDK71_”。
再看“VC++目錄”與SDK目錄相關的環境變量宏:
當平臺工具集設為“Visual Stdio 2013 (v120)”時,“VC++目錄”是指向默認Windows SDK路徑(Windows SDK 8.1)。
當平臺工具集設為“Visual Stdio 2013 - Windows XP (v120_xp)”時,“VC++目錄”是指向Windows SDK 7.1路徑。
然后可以再試試v110、v110_xp等平臺工作集,從中可以找到規律——
$(PlatformToolset):平臺工作集名稱。如 v110、v110_xp、v120、v120_xp
$(PlatformToolsetVersion):平臺工作集版本號。如 110、120。注意xp版平臺工具集(v110_xp、v120_xp)使用相同的版本號(110、120)
VC++目錄:自動綁定相關的Windows SDK。v120是Windows SDK 8.1,v110是Windows SDK 8.0,而v110_xp、v120_xp是Windows SDK 7.1。
環境變量宏:對于xp版平臺工具集,“繼承的值”中會多一項“_USING_V110_SDK71_”。
根據上面的規律,很容易區分是不是兼容WindowsXP的平臺工具集。判斷是否存在“_USING_V110_SDK71_”宏就行。
如果你像我一樣擔心“_USING_V110_SDK71_”這個宏名稱可能會增加依賴性的話,還可以使用另一種辦法——根據Windows SDK的版本來判斷是不是兼容WindowsXP的平臺工具集。具體辦法是使用_WIN32_WINNT宏,若其值小于等于0x0601(Windows7)表示兼容WindowsXP,而大于等于0x602(Windows8)時表示不兼容WindowsXP。例如——
#if (_WIN32_WINNT >= 0x602)// 不兼容WindowsXP的平臺工具集 #else// 兼容WindowsXP的平臺工具集 #endif
?
現在唯一的問題就是判斷具體的平臺工作集版本了。$(PlatformToolsetVersion)這樣的環境變量宏似乎不會自動轉為C語言宏,該怎么辦呢?
解決辦法很簡單,在“預處理器定義”中定義自己的宏就行了,例如添加一條“_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion)”
然后就能在程序中通過_MSC_PLATFORM_TOOLSET宏來判斷平臺工具集了,例如——
#if (_MSC_PLATFORM_TOOLSET > 100) // Visual Stdio 2010 (v100) ... #endif
?
?
參考文獻
~~~~~~~~
Visual Studio: how to check used C++ platform toolset programmatically. http://stackoverflow.com/questions/13794130/visual-studio-how-to-check-used-c-platform-toolset-programmatically
Using the Windows Headers. http://msdn.microsoft.com/en-us/library/aa383745.aspx
?