基于windows版本的c++条件编译

Conditionally compilation in c++ based on windows version

本文关键字:条件 编译 c++ windows 版本 基于      更新时间:2023-10-16

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

我认为它应该看起来像这样:

void SomeClass::SomeFunction()
{
    // Other code
#ifdef WINXP
    windowsXPCall();
#else
    WindowsCall();
#endif
    // Other code
}

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

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

在最简单的情况下,要以XP为目标,您需要添加

#define _WIN32_WINNT 0x0501

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

如果您不需要支持XP的原始版本(没有应用任何service Pack),请将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,则会错过在带有SP1的Windows XP中定义的功能。

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

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

对于一个可执行文件,检测"目标版本"没有多大意义;您的可执行文件必须针对每个版本。类似于上面的#ifdef无法解决您的问题,除非您生成多个可执行文件(或使用您生成多版本的助手dll)。

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