_WINDOWS_ 和 _WIN32 / _WIN64 宏的使用有区别吗?

use*_*063 3 c++ windows macros conditional-compilation

之间有区别吗:

#if defined(_WIN32) || defined(_WIN64)
Run Code Online (Sandbox Code Playgroud)

和:

#ifdef _WINDOWS_
Run Code Online (Sandbox Code Playgroud)

defined() 我知道当有超过1个条件时有必要使用。

Adr*_*ica 8

是,有一点不同。和令牌_WIN32_WIN64定义(有条件地)取决于目标平台。前者 ( _WIN32) 将为 x86、x64、ARM 和 ARM-64 架构定义;后者 ( )仅为两种 64 位架构_WIN64定义。

但是,如果给定源文件包含“Windows.h”头文件,_WINDOWS_则将始终定义该宏。它(在该标头中)用作“防护”,以防止多次包含其主体。该标头的一个非常精简的版本是:

/* ...
    Copyright (c) Microsoft Corporation. All rights reserved.
   ...
    Master include file for Windows applications.

--*/

#ifndef _WINDOWS_
#define _WINDOWS_

// ...
// <body of Windows.h>
// ...


#endif /* _WINDOWS_ */
Run Code Online (Sandbox Code Playgroud)

此外,当使用 MSVC 编译器(可能还有其他一些编译器)时,_WIN32_WIN64宏是由编译器预定义的(即不需要包含头文件来为其相关目标平台定义它们)。


只是为了增加混乱,_WINDOWS在创建面向 Windows 的新项目时,MSVC 默认情况下还添加了一个宏(注意缺少尾部下划线)(这不是正式预定义的,而是默认的每个项目“预处理器”之一)项目属性中的定义”。