关于VC预定义常量_WIN32,WIN32,_WIN64等预定义宏的介绍(整理、转载)

本文详细解释了VC中预定义宏_WIN32、_WIN64及WIN32的使用方法,通过示例代码展示了如何区分不同的编译环境,并提供了一种判断程序是否在64位环境下运行的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考帖子:
(1)MSDN上专门讲预定义宏:https://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx
(2)VS中属性页的配置介绍:http://m.blog.youkuaiyun.com/blog/justkong/7949008
(3)判断程序是否在win64环境中运行:http://fenying.blog.163.com/blog/static/10205599320137224339263/
(4)http://fenying.blog.163.com/blog/static/1020559932013725111743857/
=============================================
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
using namespace 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();
return 0;
}
 
  在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,两者都有定义。即 在 VC 下,_WIN32 一定有定义
 
  因此,WIN32/_WIN32 可以用来判断是否 Windows 系统(对于跨平台程序),而 _WIN64 用来判断编译环境是 x86 还是 x64。最后附一个表:
 
常量\定义预定义选项Windows.hVC编译器
WIN32Win32√(minwindef.h) ×
_WIN32××
_WIN64××x64

======================================================================

以下功能代码判断是否运行在 Windows x64 下。本例使用 Windows API 函数 IsWow64Process,具体请参考MSDN文档:http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx


 


 
#include
#include
 
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
 
 
LPFN_ISWOW64PROCESS fnIsWow64Process = NULL;
 
 
BOOL Isx64Application() {
    return (sizeof(LPFN_ISWOW64PROCESS) == 8)? TRUE: FALSE;
}
 
 
BOOL IsWow64() {
 
    BOOL bIsWow64 = FALSE;
 
    if (!fnIsWow64Process)
        fnIsWow64Process =(LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
 
    if(fnIsWow64Process)
        if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
            return FALSE;
 
    return bIsWow64;
}
 
int main( void ) {
 
    if (Isx64Application())
        _tprintf(TEXT("The application is a x64 program.\n"));
    else {
        if (!IsWow64())
            _tprintf(TEXT("The application is running under Windows x86.\n"));
        else
            _tprintf(TEXT("The application is a x86 program running under Windows x64.\n"));
    }
 
    return 0;
}

转载于:https://www.cnblogs.com/testlife007/p/8134702.html

<think>我们正在讨论_WIN3264平台编译器中的兼容性问题。根据用户提供的引用和之前的问题,我们需要明确以下几点: 1. 引用[1]提到在3264系统中,size_t和int的大小可能不同,这会影响程序行为。 2. 引用[2]提到在开发64应用程序时需要注意环境变化,例如一些函数会被替换(如GetWindowLong变为GetWindowLongPtr),以及一些路径字符串(如"system32")的变化。 但用户当前的问题是关于预定义_WIN3264编译器中的行为。 根据C/C++标准,_WIN32是由Microsoft编译器定义的,用于标识Windows操作系统。它在3264Windows编译中都会被定义。实际上,在64编译时,_WIN32和_WIN64都会被定义。 因此,我们可以这样回答: 在64Windows平台编译时,_WIN32仍然会被定义。这是因为_WIN32表示应用程序运行在Windows系统上(无论是32还是64)。同时,编译器会定义_WIN64来指示64环境。 所以,如果我们想检测Windows平台,我们可以使用_WIN32(它会在3264Windows编译中被定义)。如果我们想特别检测64环境,则应该使用_WIN64。 总结: - 在32Windows编译中:_WIN32被定义,_WIN64未被定义。 - 在64Windows编译中:_WIN32和_WIN64都被定义。 因此,_WIN3264平台编译器中仍然适用,它只是表示目标系统是Windows,而不区分3264。 另外,我们可以给出一个示例代码来展示如何检测平台: ```cpp #include <iostream> int main() { #if defined(_WIN32) std::cout << "This is Windows." << std::endl; #if defined(_WIN64) std::cout << "This is 64-bit Windows." << std::endl; #else std::cout << "This is 32-bit Windows." << std::endl; #endif #else std::cout << "This is not Windows." << std::endl; #endif return 0; } ``` 这样,用户就可以根据不同的宏定义来区分不同的平台环境。 最后,我们可以生成几个相关问题,以帮助用户深入了解。</think>### _WIN32 64 平台的兼容性分析 #### 1. **核心结论** - **完全兼容**:`_WIN32` 64 Windows 平台编译器中**始终被定义**(无论编译 32 64 程序)[^1][^2]。 - **设计目的**:该表示目标系统是 Windows 平台(包含 32/64 ),而非表示程序宽。 - **验证代码**: ```cpp #include <iostream> int main() { #if defined(_WIN32) std::cout << "_WIN32 is defined\n"; // 在 32/64 Windows 编译中均输出 #endif #if defined(_WIN64) std::cout << "_WIN64 is defined\n"; // 仅在 64 编译时输出 #endif return 0; } ``` #### 2. **宏定义对比** | 名称 | 32 编译 | 64 编译 | 含义 | |-------------|-----------|-----------|--------------------------| | `_WIN32` | ✅ 定义 | ✅ 定义 | 目标系统是 Windows | | `_WIN64` | ❌ 未定义 | ✅ 定义 | 目标系统是 64 Windows | | `_M_IX86` | ✅ 定义 | ❌ 未定义 | x86 架构 (32 ) | | `_M_X64` | ❌ 未定义 | ✅ 定义 | x64 架构 (64 ) | #### 3. **使用建议** 1. **检测 Windows 平台**: ```cpp #if defined(_WIN32) || defined(_WIN64) // Windows 专属代码 #endif ``` - 更简写法:`#ifdef _WIN32`(因 64 编译时 `_WIN32` 必然存在) 2. **检测程序宽**: ```cpp #if defined(_WIN64) // 64 程序逻辑(如处理 size_t 差异[^1]) #else // 32 程序逻辑 #endif ``` 3. **API 兼容性处理**(如引用 [2] 所示): ```cpp #ifdef _WIN64 SetWindowLongPtr(hWnd, GWLP_USERDATA, data); // 64 专用 #else SetWindowLong(hWnd, GWL_USERDATA, data); // 32 兼容 #endif ``` #### 4. **关键注意事项** 1. **宽敏感操作**: - 在 64 编译时,`size_t`、指针等类型大小变化(如引用 [1] 的数组访问问题) - 使用 `uintptr_t` 处理指针运算: ```cpp uintptr_t ptr_val = reinterpret_cast<uintptr_t>(pointer); ``` 2. **路径差异处理**(如引用 [2] 所述): ```cpp #ifdef _WIN64 const char* sysdir = "C:\\Windows\\SysNative\\"; // 64 重定向 #else const char* sysdir = "C:\\Windows\\System32\\"; #endif ``` 3. **编译器验证**: - MSVC、Clang、MinGW 在 Windows 平台均遵循此宏定义规则 - 可通过编译器预定义列表验证: ```bash cl /Bv myfile.cpp # MSVC gcc -dM -E - < nul | find "_WIN" # MinGW ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值