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 

有没有其他更好的方法来做到这一点?

4

5 回答 5

11

编译它的操作系统并不是那么重要。更重要的是运行代码的操作系统,您显然无法在编译时检测到。但是,如果您希望您的代码在旧版本的 Windows 上运行,您可以将WINVER_WIN32_WINNT设置为某些值,这将导致新功能不可用等(只需搜索 Windows 头文件以了解这些宏在何处进行测试以了解)。

要在运行时测试功能,请使用GetProcAddressLoadLibrary如果它在较新的 DLL 中,也可能使用 )来测试该功能是否可用。如果是,请调用它,如果不是,请不要。

如果要检测编译器版本等,另请参阅 Visual Studio 编译器使用的预定义宏。

于 2012-04-11T18:54:31.650 回答
1

有一组标准的windows 标头宏可以告诉您操作系统的确切版本

于 2012-04-11T18:52:38.067 回答
1

有些事情确实需要在编译时知道哪个操作系统版本。

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

但是如果你切换到import "winhttpcom.dll". 它可以在 Windows 10 下编译,但在 Windows 7 下失败。

所以这里需要一个 OS 宏来导入适当的 dll。

于 2019-11-13T20:57:06.480 回答
0

对于初学者,至少使用 MS VC++、WIN32、_WIN32 和 _WIN32_WINNT。除非您需要在编译时对其进行控制,否则您可能会考虑使用 GetVersionEx 之类的东西在运行时进行检测,以便相同的构建在旧版本上运行,但在新功能可用时利用它们。

于 2012-04-11T18:51:32.117 回答
-1

在我的情况下,对于想要在 Visual Studio(2017)下的 CONSOLE 和 WIN32 App 之间以不同方式编译/包含的人,我的两分钱。

您使用向导创建控制台应用程序,您将拥有:

WIN32;_DEBUG;_CONSOLE;%(预处理器定义)

在下面: 在此处输入图像描述

如果您使用win32 GUI 应用程序的向导:

WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) 所以没有 _CONSOLE。

在此处输入图像描述

所以你可以写:

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


#endif // _CONSOLE



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


#endif // _CONSOLE


    return 0;
}
于 2017-08-31T09:56:30.720 回答