C++如何判斷是否在編寫64位程式
阿新 • • 發佈:2019-01-04
VC2012 下寫 Windows 程式時,有時需要判斷編譯環境。在之前的文章《判斷程式是否執行在 Windows x64 系統下。》裡說過如何在執行期間判斷系統環境,但在編譯時如何判斷?
MSDN 裡說,VC 有 3 個預處理常量,分別是 _WIN32,_WIN64,WIN32。這三個常量如何使用呢?看起來簡單,其實是很困惑的。
在 Win32 配置下,WIN32 在“專案屬性-C/C++-前處理器-前處理器定義”裡聲明瞭,而在 x64 配置下,這個常量並不在專案預定義列表中。這是否說明可以根據 WIN32 來判斷是否在 x64 平臺呢?不。在 Windows SDK 的 minwindef.h 下第 37 行有如下定義:
WIN32
#endif
即是說,只要包含了 Windows.h,那麼 WIN32 常量是肯定定義了的,所以不能用於判斷平臺環境。但是如果在預處理定義裡刪掉 WIN32,又不包含 Windows.h,那麼 WIN32 未定義。 下面看 _WIN32 和 _WIN64,這兩個比較特別,沒有任何顯式定義。在 Windows.h 裡沒有,在“專案屬性-C/C++-前處理器-前處理器定義”下也沒有。根據 MSDN,這是由編譯器(ml.exe/ml64.exe)內部定義的。具體描述是 _WIN32:Defined for applications for Win32 and Win64. Always defined.
_WIN64:Defined for applications for Win64.
下面看一段程式:(分別在 Win32 和 x64 配置下執行一次)
<< endl;
#endif
cin.get();
return0;
}
在 Win32 配置下,_WIN32 有定義,_WIN64 沒有定義。在 x64 配置下,兩者都有定義。即在 VC 下,_WIN32 一定有定義。
因此,WIN32/_WIN32 可以用來判斷是否 Windows 系統(對於跨平臺程式),而 _WIN64 用來判斷編譯環境是 x86 還是 x64。最後附一個表:
#ifndef WIN32 #define
即是說,只要包含了 Windows.h,那麼 WIN32 常量是肯定定義了的,所以不能用於判斷平臺環境。但是如果在預處理定義裡刪掉 WIN32,又不包含 Windows.h,那麼 WIN32 未定義。 下面看 _WIN32 和 _WIN64,這兩個比較特別,沒有任何顯式定義。在 Windows.h 裡沒有,在“專案屬性-C/C++-前處理器-前處理器定義”下也沒有。根據 MSDN,這是由編譯器(ml.exe/ml64.exe)內部定義的。具體描述是 _WIN32:Defined for applications for Win32 and Win64. Always defined.
#include<iostream> usingnamespace std; int main(){ #ifdef _WIN64 cout <<"_WIN64 is defined as "<< _WIN64 << endl; #endif #ifdef _WIN32 cout <<"_WIN32 is defined as "<< _WIN32
常量\定義 | 預定義選項 | Windows.h | VC編譯器 |
WIN32 | Win32 | √(minwindef.h) | × |
_WIN32 | × | × | √ |
_WIN64 | × | × | x64 |