2012-04-11 69 views
5

是否存在任何C++編譯時宏,它們用於檢測正在編譯代碼的Windows操作系統。我基本上只想在Win7上支持某些功能。所以我有興趣做這樣的事情C++編譯時宏檢測windows操作系統

#if <os_macro> = WIN7 
    // This function would do something valid only on Win7 builds. 
    bool myfunction { 
     // do something here 
    } 
#else 
    // This function would typically return false, since its not supported on OS below win7 
    bool myfunction { 
     return false; 
    } 
#endif 

有沒有其他更好的方法來做到這一點?

+4

如何是操作系統它在助人編譯?它不需要知道它運行在哪個操作系統上? – 2012-04-11 18:49:17

+0

在Visual Studio中,您可以使用'#ifdef WIN32'或'#ifdef _WINDOWS'作爲跨平臺。如果你只是想要Windows版本,你通常自己定義'WINVER'。對於Windows 7'#define WINVER 0x0601' – AJG85 2012-04-11 18:56:05

回答

10

的操作系統,它得到上編譯的確切版本並不那麼重要;更重要的是代碼爲的操作系統運行,這顯然在編譯時無法檢測到。但是如果你想讓你的代碼在老版本的Windows上運行,你可以將WINVER and _WIN32_WINNT設置爲某些值,這會導致新功能無法使用等等。(只要在Windows頭文件中搜索這些宏測試的位置以獲取想法)。

要在運行時測試功能,請使用GetProcAddress(也可能是LoadLibrary,如果它位於較新的DLL中),以測試該功能是否可用。如果是,請打電話,如果沒有,請不要。

參見通過在Visual Studio編譯器使用的predefined macros如果你要檢測的編譯器版本等

+0

基本上我應該可以說,這是一個具有一定功能的Win7版本,而這是一個WinXP版本,它沒有。在這裏,我將定義能力應該是什麼。 – Rajiv 2012-04-11 18:59:50

+3

你爲什麼要單獨構建?爲什麼不讓一個構建的行爲有所不同取決於它運行的操作系統? – 2012-04-11 19:05:48

+0

謝謝。理解我做錯了什麼。 – Rajiv 2012-04-11 19:52:11

0

至少對於初學者來說,MS VC++,WIN32,_WIN32和_WIN32_WINNT。除非需要在編譯時控制它,否則可能會考慮使用類似於GetVersionEx的方法在運行時進行檢測,所以同一版本可以在舊版本上運行,但在可用時可利用新功能。

1

有一組標準的windows header macros告訴你OS

+0

這些宏如何做比較?我試着用Winver這樣#if WINVER> = _WIN32_WINNT_WIN7,但是效果不好。 – Rajiv 2012-04-11 18:54:26

0

我的兩分錢的希望編譯/人包括不同的Visual Studio下的控制檯和Win32應用程序之間(2017年)在我的情況。

您在使用嚮導創建一個控制檯應用程序,您將有:

WIN32,_DEBUG; _CONSOLE;%(PreprocessorDefinitions)

下: enter image description here

如果您使用嚮導win32 GUI A pp:

WIN32; _DEBUG; _WINDOWS;%(PreprocessorDefinitions) 因此沒有_CONSOLE。

enter image description here

所以你可以寫:

#ifdef _CONSOLE 
// for Console 
#else 
// for GUI 


#endif // _CONSOLE 



int main() 
{ 
#ifdef _CONSOLE 
    // for Console 
#else 
    // for GUI 


#endif // _CONSOLE 


    return 0; 
}