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个条件时有必要使用。
是,有一点不同。和令牌_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 默认情况下还添加了一个宏(注意缺少尾部下划线)(这不是正式预定义的,而是默认的每个项目“预处理器”之一)项目属性中的定义”。