這個問題很簡單。我想需要一個函數(C++)或方法,它將,隨叫隨到,returun像如何找到操作系統的名稱?
"Windows" //or
"Unix"
沒什麼特別的,我不需要了的版本號,或任何東西。只是os的名字。一個快速谷歌搜索沒有什麼有用的東西,所以我想我會在這裏發佈
這個問題很簡單。我想需要一個函數(C++)或方法,它將,隨叫隨到,returun像如何找到操作系統的名稱?
"Windows" //or
"Unix"
沒什麼特別的,我不需要了的版本號,或任何東西。只是os的名字。一個快速谷歌搜索沒有什麼有用的東西,所以我想我會在這裏發佈
由於你不能有一個單一的二進制文件運行在所有的操作系統,你需要重新編譯你的代碼。可以使用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什麼宏。
我降低了投票率,因爲這是以非移動方式重塑車輪。 – 2013-03-22 21:44:03
@ H2CO3下C++編譯器/操作系統將無法編譯?代碼可移植性是否可以用任何OS上的兼容編譯器進行編譯? – MerickOWA 2013-03-22 21:45:31
@MerickOWA「以不可移植的方式」:宏M. M.的用法既不在C語言中,也不在C++標準中定義。 「重塑車輪」:代碼複製了標準庫中的功能。 – 2013-03-22 21:47:14
從波蘇源代碼:
的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;
}
有沒有通用的解決方案,如前所述。正因爲這個原因,Qt增加了'QSysInfo'。 – MSalters 2013-03-22 22:29:52