2013-03-22 17 views
9

Pytania są bardzo proste. Chcę chcą funkcję (C++) lub metody, które będą na wezwanie, returun coś podobnegoJak znaleźć nazwę systemu operacyjnego?

"Windows" //or 
"Unix" 

Nic nadzwyczajnego, ja nie potrzebuję numbe wersji lub cokolwiek. Tylko nazwa os. Szybka wyszukiwarka google nie znalazła nic przydatnego, więc pomyślałem, że mogę to opublikować tutaj

+0

Nie ma uniwersalnego rozwiązania, jak już wspomniano. Qt dodało 'QSysInfo' właśnie z tego powodu. – MSalters

Odpowiedz

22

Ponieważ nie możesz mieć pojedynczego pliku binarnego, który działa na wszystkich systemach operacyjnych, i musisz ponownie skompilować swój kod ponownie. Używanie MACRO jest w porządku.

używać makr, takich jak

_WIN32 
_WIN64 
__unix 
__unix__ 
__APPLE__ 
__MACH__ 
__linux__ 
__FreeBSD__ 

jak ten

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 
}      

należy przeczytać instrukcje kompilator i zobaczyć co MACROS one przewidziane do wykrywania OS w czasie kompilacji.

+0

Uniewinniony, ponieważ to wymyśla koło w sposób nieprzenośny. –

+6

@ H2CO3 pod jakim kompilatorem C++/OS by się nie skompilował? Czy przenośność kodu nie jest mierzona jego kompilacją w dowolnym systemie operacyjnym? – MerickOWA

+0

@MerickOWA "w sposób nieprzenośny": używane makra M. M. nie są zdefiniowane ani w C ani w standardzie C++. "Reinventing the wheel": kod odtwarza funkcje obecne w standardowej bibliotece. –

3

z kodu źródłowego 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; 
} 
Powiązane problemy