如何查找操作系统的名称?

16

问题非常简单。我想要一个函数(C++)或方法,在调用时返回类似于以下内容的东西

"Windows" //or
"Unix"

没什么花头,我不需要版本号或其他东西。只要操作系统的名称。快速谷歌搜索没有找到有用的信息,所以我想在这里发布。


正如已经指出的那样,没有通用解决方案。Qt添加了QSysInfo就是为了这个目的。 - MSalters
2个回答

36

由于不能有一个单一的二进制文件可以在所有操作系统上运行,您需要重新编译代码。使用宏定义是可以的。

可以使用以下宏定义:

_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
}                      

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


9
在哪个 C++ 编译器/操作系统下,这段代码会编译失败?代码的可移植性不是衡量其能否在任何符合标准的编译器和操作系统上编译吗? - MerickOWA
2
@H2CO3 哪个标准库?C++标准库没有定义uname函数。 - MerickOWA
1
请查看我在下面附上的GNU文档注释。我不建议在应用程序代码中使用特定于系统的内部宏。 - Roman Nikitchenko
1
不可靠。可能会将WINE报告为Windows,FreeBSD报告为Linux。 - MSalters
2
@Brendan:你说得对;但是当代码在Wine上运行时,正确的答案是什么?从代码的角度来看,根据实际问题,Windows或Linux都可能是正确的。 - masoud
显示剩余5条评论

4

以下为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;
}

3
这并没有提供一种单一的跨平台实现来区分操作系统,例如Windows和Linux,而是提供了两个依赖于平台的实现来告知操作系统的版本,需要您已经知道您正在使用的是Windows还是Linux。 - Zoey Hewll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接