基于Windows版本在c ++中有条件地编译

时间:2015-12-05 01:15:13

标签: c++ windows compilation windows-xp

我有一个应该在XP及以上版本中运行的Windows应用程序。但Windows的Windows API通常与vista及以上版本不同。我可以检查哪些条件编译标志来确定编译代码的Windows操作系统?如果没有,有没有办法实现这个目标?

我认为它应该是这样的:

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

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

    // Other code
}

2 个答案:

答案 0 :(得分:2)

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

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

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

#define _WIN32_WINNT 0x0501

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

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

  

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

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

  

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

答案 1 :(得分:0)

使用一个可执行文件,检测"您目标是什么版本"没有多大意义;您的可执行文件必须针对每个版本。 #ifdef如上所述无法解决您的问题,除非您构建多个可执行文件(或使用您构建多个版本的帮助程序DLL)。

您的问题可以通过&#34来解决;如何限制winXP可用的API"。 @ dxiv的答案解决了这个问题。