14

質問はとても簡単です。呼び出し時に次のようなものを返す関数(C ++)またはメソッドが必要です

"Windows" //or
"Unix"

特別なことは何もありません、私はバージョン番号か何かを必要としません。ただのOS名。簡単なグーグル検索では何も役に立たなかったので、これをここに投稿すると思いました

4

2 に答える 2

34

すべてのオペレーティングシステムで実行される単一のバイナリファイルを作成することはできないため、コードを再コンパイルする必要があります。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
}                      

コンパイラのマニュアルを読んで、コンパイル時にOSを検出するためにそれらが提供するMACROSを確認する必要があります。

于 2013-03-22T21:33:10.567 に答える
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;
}
于 2013-03-22T22:33:57.900 に答える