如何使用预处理器指令检查操作系统版本(Windows)?

Posted

技术标签:

【中文标题】如何使用预处理器指令检查操作系统版本(Windows)?【英文标题】:How can I check OS version (Windows) with preprocessor directives? 【发布时间】:2013-07-07 16:35:50 【问题描述】:

我想知道是否有机会检查我真正使用的 Windows 版本。类似于:How do I check OS with a preprocessor directive?。

我尝试了 MSDN 中的代码:

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx

但是它们中的任何一个都给了我很好的结果(例如:根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx,当我在 Windows XP 上时,我的代码应该打印 5.1 但它显示为 5 ...)

是否有任何可靠的方法(我更喜欢预处理器指令的方法)来找出我正在使用的 Windows?

我的代码:

#include <windows.h>
#include <iostream>

int main()

    OSVERSIONINFO osvi;
    BOOL bIsWindowsXPorLater;

    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    GetVersionEx(&osvi);

    // I HAD THIS, AND IT WAS WRONG! :<
    std::cout << osvi.dwMajorVersion << "\n";

    // CHANGED THE ABOVE LINE TO THE LINE BELOW AND IT IS OK NOW :D
    std::cout << osvi.dwMajorVersion << "." << osvi.dwMinorVersion << "\n";


    return 0;

【问题讨论】:

使用预处理器指令设置会有点困难。当您需要更新的功能时,您必须告诉标题是有原因的。 @chris: 好的,并且没有预处理器指令 - 有可能吗? 我能说的最好的就是GetVersion 的东西。我不知道你为什么会得到错误的答案。 @mazix 你是如何调用 GetVersionEx 函数的? 你只输出主要版本部分。 【参考方案1】:

您实际上得到了正确的结果。但是您只打印主要版本:

std::cout << osvi.dwMajorVersion << "\n";

尝试使用:

if (osvi.dwMinorVersion >= 1) 
     std::cout << osvi.dwMajorVersion << "." << osvi.dwMinorVersion << std::endl;
 else 
     std::cout << osvi.dwMajorVersion << std::endl;

【讨论】:

以上是关于如何使用预处理器指令检查操作系统版本(Windows)?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查我的 ifunc 解析器中是不是有 BMI2 指令?

如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?

C#预处理器指令

您可以为 C# 版本添加预处理器指令吗?

C#如何获取已定义预处理器的列表?

Objective-C 预处理器指令