【问题标题】:Conditionally compilation in c++ based on windows version基于windows版本的c++条件编译
【发布时间】:2015-12-05 01:15:12
【问题描述】:

我有一个应该在 XP 及更高版本中运行的 Windows 应用程序。但是 Windows API for XP 通常不同于 vista 及更高版本。我可以检查哪些条件编译标志来确定代码正在为哪些 Windows 操作系统编译?如果没有,有什么办法可以做到这一点?

我认为它应该是这样的:

void SomeClass::SomeFunction()
{
    // Other code

#ifdef WINXP
    windowsXPCall();
#else
    WindowsCall();
#endif

    // Other code
}

【问题讨论】:

  • 我相信系统库:cplusplus.com/reference/cstdlib/system可以用来运行可执行文件。使用它,您可以运行类似于 Windows 版本检查器的东西。然而,这只会在运行时发生,并且在编译时可能没有那么有用。不知道这是否能解决你的问题,但祝你好运:)
  • 您通常不会为 Windows XP 构建单独的应用程序,而是构建适用于 XP 和更高版本的单个应用程序。有时这意味着只使用 WindowsXPCall,在大多数情况下,它在以后的版本中仍然可用,有时这意味着决定在运行时进行哪个调用。
  • 如果您真的想构建一个单独的可执行文件,您可以按照this question 检测 XP 工具集的使用情况。
  • @Liang:无需使用单独的应用程序来检测 Windows 版本。 API 提供版本检查工具,但通常最好检测功能而不是版本;例如,您可以使用 GetProcAddress 找出特定 API 函数是否存在。
  • 如果你 need to build one executable for all windows platform 那么 OP 中的 #ifdef WINXP 没有意义。这是一个编译时指令,如果你在定义和不定义 WINXP 的情况下编译两次,那么你最终会得到不同平台的不同可执行文件。

标签: c++ windows compilation windows-xp


【解决方案1】:

答案取决于编译器和工具链。如果问题是关于 Visual C++ 那么你应该这样标记它。

对于 VC++,支持的目标最低操作系统版本由Using the Windows Headers 中描述的一组宏控制。

在最简单的情况下,要定位 XP,您需要添加

#define _WIN32_WINNT 0x0501

在包含任何 Windows 标头之前,或将 /D_WIN32_WINNT=0x0501 添加到编译器命令行。

如果您不需要支持 XP 的原始版本(未应用任何服务包),请将 0x0501 替换为 0x0502,请参阅同一链接文章中的此说明。

请注意,最新版本的 Windows 中引入的某些功能可能会添加到以前版本的 Windows 的服务包中。因此,要针对服务包,您可能需要使用下一个主要操作系统版本的值来定义 _WIN32_WINNT。例如,GetDllDirectory 函数是在 Windows Server 2003 中引入的,如果 _WIN32_WINNT 为 0x0502 或更大,则有条件地定义该函数。此功能也被添加到带有 SP1 的 Windows XP 中。因此,如果您将 _WIN32_WINNT 定义为 0x0501 以针对 Windows XP,您将错过 Windows XP SP1 中定义的功能。

附:控制自己代码的源和编译标志的是你,所以我不知道如何回答原问题的这部分。

我可以检查哪些条件编译标志来确定代码正在为哪些 Windows 操作系统编译?

【讨论】:

    【解决方案2】:

    对于一个可执行文件,检测“您的目标版本”没有多大意义;您的可执行文件必须针对每个版本。 #ifdef 像上面这样无法解决您的问题,除非您构建多个可执行文件(或使用您构建多个版本的辅助 dll)。

    您的问题可以通过“我如何限制winXP可用的API”来解决。 @dxiv 的回答解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2010-09-29
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多