C++编译时宏用于检测Windows操作系统。

5

有没有C++编译时宏可以检测代码正在哪个Windows操作系统上编译。我想仅在Win7上支持某些函数。因此,我想做这样的事情:

#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 

有没有其他更好的方法来做这件事?


5
编译在哪个操作系统上对于它有何帮助?难道不需要知道它正在运行在哪个操作系统上吗? - Mark B
2
在Visual Studio中,您可以使用#ifdef WIN32#ifdef _WINDOWS进行跨平台开发。如果您只需要Windows版本,则通常自己定义WINVER。对于Windows 7,可以使用#define WINVER 0x0601 - AJG85
6个回答

11
它被编译的操作系统并不是很重要;更重要的是代码运行的操作系统,这显然无法在编译时检测到。但如果您希望您的代码在较旧版本的Windows上运行,可以将WINVER_WIN32_WINNT设置为特定值,这将导致新函数不可用等(只需搜索Windows头文件以查找测试这些宏的位置即可了解)。
要在运行时测试功能,请使用GetProcAddress(如果它在较新的DLL中,则可能还需要使用LoadLibrary)来测试函数是否可用。如果可用,则调用它,否则不要调用。

如果您想检测编译器版本等信息,请参阅Visual Studio编译器使用的预定义宏


基本上,我应该能够说,这是一个具有某些功能的Win7版本,而这是一个没有这些功能的WinXP版本。在这里,我将定义这些功能应该是什么。 - Rajiv
3
为什么你想要分开构建(软件)?为什么不使用一个构建,在不同的操作系统上运行时表现不同呢? - Adam Rosenfield

1

我该如何使用这些宏进行比较?我尝试了类似于 #if WINVER >= _WIN32_WINNT_WIN7 的方式,但效果不是很好。 - Rajiv

1

有些事情需要在编译时知道操作系统的版本。

例如,import "winhttp.dll" 在 Windows 7 下会编译通过,但在 Windows 10 下会引发编译时错误(C1083)。

但如果切换到 import "winhttpcom.dll",它将在 Windows 10 下编译通过,但在 Windows 7 下失败。

因此,在这里需要一个操作系统宏来导入适当的 dll。


如何修复这个问题? - BigChief

0

至少从MS VC++,WIN32,_WIN32和_WIN32_WINNT开始考虑。除非您需要在编译时控制它,否则您可以考虑使用类似GetVersionEx的东西在运行时进行检测,这样相同的构建将在旧版本上运行,但在新功能可用时利用新功能。


0

我的回答晚了10年,但为即将到来的几年发布答案。

要检测版本 c/c++ 编译器版本可以使用。适当的宏如下所示:

_MSC_VER 

_MSC_FULL_VER

参考:MS 宏


-1

对于那些想在Visual Studio(2017)下编译/包含控制台和WIN32应用程序的人,我有一些建议。

如果您使用向导创建控制台应用程序,则会有:

WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)

在以下位置: enter image description here

如果您使用向导创建win32 GUI App:

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接