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

C++ 如何查找操作系统的名称?,c++,operating-system,C++,Operating System,问题很简单。我想要一个函数(C++)或方法,它可以在调用时重新调用 "Windows" //or "Unix" 没什么特别的,我不需要版本号什么的。只是操作系统名称。一个快速的google searc并没有发现任何有用的东西,所以我想我应该在这里发布这个,因为你不能有一个运行在所有操作系统上的二进制文件,你需要重新编译你的代码。可以使用宏 使用宏,例如 _WIN32 _WIN64 __unix __unix__ __APPLE__ __MACH__ __linux__ __FreeBSD__

问题很简单。我想要一个函数(C++)或方法,它可以在调用时重新调用

"Windows" //or
"Unix"

没什么特别的,我不需要版本号什么的。只是操作系统名称。一个快速的google searc并没有发现任何有用的东西,所以我想我应该在这里发布这个

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

使用宏,例如

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

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

来自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;
}

在哪些C++编译器/操作系统下编译失败?代码的可移植性不是通过在任何操作系统上使用任何兼容编译器编译的能力来衡量的吗?@H2CO3哪个标准库?C++标准库不定义一个unMaple函数。下面用GNU文档引用我的评论。我不建议在应用程序代码中使用特定于系统的内部宏。这不可靠。可以将WINE报告为Windows,将FreeBSD报告为Linux。@Brendan:你说得对;但是,当代码在Wine上运行时,正确的答案是什么?从代码的角度来看,根据实际问题的不同,Windows或Linux可能是正确的。正如前面提到的,没有通用的解决方案。Qt添加了
QSysInfo
正是出于这个原因。这并没有给出一个跨平台的实现来区分操作系统,例如windows和linux,而是提供了两个依赖于平台的实现来告诉您操作系统的版本,这要求您已经知道您使用的是windows还是linux。