c++判斷程式及作業系統位數
阿新 • • 發佈:2019-01-06
曾經在書上看到過,也被人問起過,搜尋過,為了記憶更加深刻,還是寫一篇博文吧~
程式位數是將一段程式編譯後,程式本身的位數,比如32bit。
32bit程式在一般情況下可以在32bit和64bit的作業系統上執行。
下面分別列出獲取程式位數和作業系統位數的方法:
程式位數:
通過指標位數即可獲得:
sizeof(void*) * 8
作業系統位數:
Windows:
#include <Windows.h> #include <stdio.h> #include <tchar.h> #include <conio.h> // 安全的取得真實系統資訊 VOID SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo) { if (NULL==lpSystemInfo) return; typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo); LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");; if (NULL != fnGetNativeSystemInfo) { fnGetNativeSystemInfo(lpSystemInfo); } else { GetSystemInfo(lpSystemInfo); } } // 獲取作業系統位數 int GetSystemBits() { SYSTEM_INFO si; SafeGetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) { return 64; } return 32; } int _tmain(int argc, _TCHAR* argv[]) { const int nBitCode = GetProgramBits(); const int nBitSys = GetSystemBits(); _tprintf(_T("I am a %dbit Program, run on %dbit System."), nBitCode, nBitSys); // _getch(); return 0; }
注:
1.GetNativeSystemInfo是Windows XP的新增API,用於取得真實系統資訊。(32位程式執行在64位系統上時,GetSystemInfo返回的是經過WOW64修改後的資訊)
2.IsWow64Process用於判斷某程序是否執行在WOW64下。對於64位程式,Wow64Process引數會返回FALSE
Linux:
貌似系統沒有直接的api,大家通過shell指令碼獲取到資訊後,傳入檔案。
通過shell自動生成一個頭檔案fdfs_os_bits.h,標頭檔案中通過巨集OS_BITS來定義作業系統的位數(32或者64)。在Linux中已經除錯通過。shell程式碼片斷如下:
tmp_src_filename=fdfs_check_bits.c cat <<EOF > $tmp_src_filename #include <stdio.h> int main() { printf("%d\n", sizeof(long)); return 0; } EOF cc $tmp_src_filename bytes=`./a.out` /bin/rm -f a.out $tmp_src_filename if [ "$bytes" -eq 8 ]; then OS_BITS=64 else OS_BITS=32 fi cat <<EOF > common/fdfs_os_bits.h #ifndef _FDFS_OS_BITS #define _FDFS_OS_BITS #define OS_BITS $OS_BITS #endif EOF
參考: