1. 程式人生 > >c++判斷程式及作業系統位數

c++判斷程式及作業系統位數

曾經在書上看到過,也被人問起過,搜尋過,為了記憶更加深刻,還是寫一篇博文吧~

程式位數是將一段程式編譯後,程式本身的位數,比如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


參考: