1. 程式人生 > >C++如何判斷是否在編寫64位程式

C++如何判斷是否在編寫64位程式

VC2012 下寫 Windows 程式時,有時需要判斷編譯環境。在之前的文章《判斷程式是否執行在 Windows x64 系統下。》裡說過如何在執行期間判斷系統環境,但在編譯時如何判斷?   MSDN 裡說,VC 有 3 個預處理常量,分別是 _WIN32,_WIN64,WIN32。這三個常量如何使用呢?看起來簡單,其實是很困惑的。   在 Win32 配置下,WIN32 在“專案屬性-C/C++-前處理器-前處理器定義”裡聲明瞭,而在 x64 配置下,這個常量並不在專案預定義列表中。這是否說明可以根據 WIN32 來判斷是否在 x64 平臺呢?不。在 Windows SDK 的 minwindef.h 下第 37 行有如下定義:

#ifndef WIN32 #define

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 配置下執行一次)

#include<iostream> usingnamespace std; int main(){ #ifdef _WIN64 cout <<"_WIN64 is defined as "<< _WIN64 << endl; #endif #ifdef _WIN32 cout <<"_WIN32 is defined as "<< _WIN32

<< endl; #endif cin.get(); return0; }

  在 Win32 配置下,_WIN32 有定義,_WIN64 沒有定義。在 x64 配置下,兩者都有定義。即在 VC 下,_WIN32 一定有定義。   因此,WIN32/_WIN32 可以用來判斷是否 Windows 系統(對於跨平臺程式),而 _WIN64 用來判斷編譯環境是 x86 還是 x64。最後附一個表:
常量\定義 預定義選項 Windows.h VC編譯器
WIN32 Win32 √(minwindef.h)  ×
_WIN32 × ×
_WIN64 × × x64