2012-04-11 71 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; 
}