2013-03-22 60 views
9

這個問題很簡單。我想需要一個函數(C++)或方法,它將,隨叫隨到,returun像如何找到操作系統的名稱?

"Windows" //or 
"Unix" 

沒什麼特別的,我不需要了的版本號,或任何東西。只是os的名字。一個快速谷歌搜索沒有什麼有用的東西,所以我想我會在這裏發佈

+0

有沒有通用的解決方案,如前所述。正因爲這個原因,Qt增加了'QSysInfo'。 – MSalters 2013-03-22 22:29:52

回答

22

由於你不能有一個單一的二進制文件運行在所有的操作系​​統,你需要重新編譯你的代碼。可以使用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 __unix || __unix__ 
    return "Unix"; 
    #elif __APPLE__ || __MACH__ 
    return "Mac OSX"; 
    #elif __linux__ 
    return "Linux"; 
    #elif __FreeBSD__ 
    return "FreeBSD"; 
    #else 
    return "Other"; 
    #endif 
}      

你應該閱讀編譯器的手冊,看看他們提供的檢測在編譯時OS什麼宏。

+0

我降低了投票率,因爲這是以非移動方式重塑車輪。 – 2013-03-22 21:44:03

+6

@ H2CO3下C++編譯器/操作系統將無法編譯?代碼可移植性是否可以用任何OS上的兼容編譯器進行編譯? – MerickOWA 2013-03-22 21:45:31

+0

@MerickOWA「以不可移植的方式」:宏M. M.的用法既不在C語言中,也不在C++標準中定義。 「重塑車輪」:代碼複製了標準庫中的功能。 – 2013-03-22 21:47:14

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; 
} 
相關問題