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

本文详细解释了_VC预定义常量_WIN32、_WIN64及WIN32的使用场景,介绍了它们如何帮助判断程序运行环境,并提供了一个示例程序来演示如何确定程序是否在Windows x64环境下运行。

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

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

 

参考帖子:
(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/102055993201372511174385 7/
=============================================
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 ;
}

<think>我们正在讨论_WIN3264位平台编译器中的兼容性问题。根据用户提供的引用和之前的问题,我们需要明确以下几点: 1. 引用[1]提到在32位和64位系统中,size_t和int的大小可能不同,这会影响程序行为。 2. 引用[2]提到在开发64位应用程序时需要注意环境变化,例如一些函数会被替换(如GetWindowLong变为GetWindowLongPtr),以及一些路径字符串(如"system32")的变化。 但用户当前的问题是关于预定义_WIN3264位编译器中的行为。 根据C/C++标准,_WIN32是由Microsoft编译器定义的,用于标识Windows操作系统。它在32位和64Windows编译中都会被定义。实际上,在64位编译时,_WIN32和_WIN64都会被定义。 因此,我们可以这样回答: 在64Windows平台编译时,_WIN32仍然会被定义。这是因为_WIN32表示应用程序运行在Windows系统上(无论是32位还是64位)。同时,编译器会定义_WIN64来指示64位环境。 所以,如果我们想检测Windows平台,我们可以使用_WIN32(它会在32位和64Windows编译中被定义)。如果我们想特别检测64位环境,则应该使用_WIN64。 总结: - 在32位Windows编译中:_WIN32被定义,_WIN64未被定义。 - 在64Windows编译中:_WIN32和_WIN64都被定义。 因此,_WIN3264位平台编译器中仍然适用,它只是表示目标系统是Windows,而不区分32位或64位。 另外,我们可以给出一个示例代码来展示如何检测平台: ```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` 64Windows 平台编译器中**始终被定义**(无论编译 32 位或 64 位程序)[^1][^2]。 - **设计目的**:该表示目标系统是 Windows 平台(包含 32/64 位),而非表示程序位宽。 - **验证代码**: ```cpp #include <iostream> int main() { #if defined(_WIN32) std::cout << "_WIN32 is defined\n"; // 在 32/64Windows 编译中均输出 #endif #if defined(_WIN64) std::cout << "_WIN64 is defined\n"; // 仅在 64 位编译时输出 #endif return 0; } ``` #### 2. **定义对比** | 名称 | 32 位编译 | 64 位编译 | 含义 | |-------------|-----------|-----------|--------------------------| | `_WIN32` | ✅ 定义 | ✅ 定义 | 目标系统是 Windows | | `_WIN64` | ❌ 未定义 | ✅ 定义 | 目标系统是 64Windows | | `_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、付费专栏及课程。

余额充值