【问题标题】:How do I find the name of an operating system?如何找到操作系统的名称?
【发布时间】:2013-03-12 21:22:01
【问题描述】:

问题很简单。我想要一个函数(C++)或方法,它会在调用时返回类似

的东西
"Windows" //or
"Unix"

没什么花哨的,我不需要版本号或任何东西。只是操作系统名称。一个快速的谷歌搜索没有发现任何有用的东西,所以我想我会在这里发布这个

【问题讨论】:

  • 如前所述,没有通用的解决方案。正是出于这个原因,Qt 添加了QSysInfo

标签: c++ operating-system


【解决方案1】:

因为你不能有一个在所有操作系统上运行的二进制文件,你需要重新编译你的代码。可以使用 MACRO。

使用宏如

_WIN32
_WIN64
__unix
__unix__
__APPLE__
__MACH__
__linux__
__FreeBSD__

喜欢这个

std::string getOsName()
{
    #ifdef _WIN32
    return "Windows 32-bit";
    #elif _WIN64
    return "Windows 64-bit";
    #elif __APPLE__ || __MACH__
    return "Mac OSX";
    #elif __linux__
    return "Linux";
    #elif __FreeBSD__
    return "FreeBSD";
    #elif __unix || __unix__
    return "Unix";
    #else
    return "Other";
    #endif
}                      

你应该阅读编译器的手册,看看他们提供了哪些宏来在编译时检测操作系统。

【讨论】:

  • @H2CO3 在什么 C++ 编译器/操作系统下编译会失败?代码可移植性不是通过在任何操作系统上使用任何兼容编译器进行编译的能力来衡量的吗?
  • @H2CO3 哪个标准库? C++ 标准库没有定义 uname 函数。
  • 看看我下面的评论,引用来自 GNU 文档。我不建议在应用程序代码中使用系统特定的内部宏。
  • 不可靠。可以将 WINE 报告为 Windows,将 FreeBSD 报告为 Linux。
  • @Brendan:你是对的;但是当代码在 Wine 上运行时,正确的答案是什么?从代码的角度来看,根据实际问题,Windows 或 Linux 都可能是正确的。
【解决方案2】:

来自 Poco 源代码:

Win32:

std::string EnvironmentImpl::osNameImpl()
{
    OSVERSIONINFO vi;
    vi.dwOSVersionInfoSize = sizeof(vi);
    if (GetVersionEx(&vi) == 0) throw SystemException("Cannot get OS version information");
    switch (vi.dwPlatformId)
    {
    case VER_PLATFORM_WIN32s:
        return "Windows 3.x";
    case VER_PLATFORM_WIN32_WINDOWS:
        return vi.dwMinorVersion == 0 ? "Windows 95" : "Windows 98";
    case VER_PLATFORM_WIN32_NT:
        return "Windows NT";
    default:
        return "Unknown";
    }
}

Unix:

std::string EnvironmentImpl::osNameImpl()
{
    struct utsname uts;
    uname(&uts);
    return uts.sysname;
}

【讨论】:

  • 这并没有给出一个单一的跨平台实现来区分操作系统,例如 windows 和 linux,而是两个平台相关的实现来告诉操作系统的版本,需要你已经知道你是否有windows或linux。
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2016-01-13
相关资源
最近更新 更多