基于windows版本的c++条件编译
Conditionally compilation in c++ based on windows version
我有一个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的答案解决了这个问题。
- 如何摆脱为条件编译定义预处理器宏的需要?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 基于宏中传递的字符串的条件编译
- Eclipse CDT 条件编译?
- 除了使用 #define 进行条件编译之外,还有其他选择吗?
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- C 模板:如何根据数据类型有条件编译不同的代码
- 多个条件编译符号
- 如何在不弄乱库 API 的情况下实现条件编译?
- #ifdef SWIG:什么时候考虑这种条件编译
- 预处理器和模板参数或代码段的条件编译
- 条件编译和非类型模板参数
- 模板的条件编译
- 我们有没有像c一样用java进行条件编译
- 模板模板条件编译
- 基于模板值的条件编译
- 类的条件编译
- 系统头文件中的条件编译
- 与 32 位和 64 位应用程序相同的源代码的条件编译
- 基于windows版本的c++条件编译