2013-03-22 10 views
9

質問はかなり簡単です。私は、呼び出しに、オペレーティングシステムの名前はどのようにして確認できますか?

"Windows" //or 
"Unix" 

何も空想のようなものをreturunする関数(C++)またはメソッドをしたいしたい、私はバージョンnumbeか何かを必要といけません。ちょうどOSの名前。私はここでこれを投稿すると思いました。

+0

すでに述べたように普遍的な解決策は、ありません。 Qtは正確にその理由のために 'QSysInfo'を追加しました。 – MSalters

答えて

22

すべてのオペレーティングシステムで動作する1つのバイナリファイルを持つことはできず、コードを再度コンパイルする必要があります。 MACROを使用しても問題ありません。そのようなあなたは、コンパイラのマニュアルを読んで、彼らはコンパイル時にOSを検出するために設けられたものをマクロ表示されるはずです。この

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

よう

_WIN32 
_WIN64 
__unix 
__unix__ 
__APPLE__ 
__MACH__ 
__linux__ 
__FreeBSD__ 

として

使用マクロ。ポコのソースコードから

+0

私は、これが車輪を携帯不可能な方法で再発明しているので、私は下降しました。 –

+6

@ H2CO3のC++コンパイラ/ OSでこれはコンパイルに失敗しますか?コード移植性は、OS上のコンパイラにコンパイルされた能力によって評価されないのですか? – MerickOWA

+0

@MerickOWA "移植性のない方法で":M.Mが使用するマクロは、C言語でもC++標準でも定義されていません。 「ホイールを再考する」:標準ライブラリに存在する機能を複製します。 –

3

の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; 
} 
関連する問題