【问题标题】:what actually sets the _WIN32 or _WIN64 preprocessor?_WIN32 或 _WIN64 预处理器的实际设置是什么?
【发布时间】:2019-12-30 13:01:33
【问题描述】:
在大多数源代码中实际设置 _WIN32 或 _WIN64 预处理器定义的内容
我发现的所有来源都是没有任何
#define _WIN32
也没有
#define _WIN64
但是由于源代码是由 GCC 编译的,预处理器会进入真实状态,就像定义已经被编写和定义一样,
问题也适用于其他操作系统关键字,因为它很可能具有相同的行为
非常感谢。
【问题讨论】:
标签:
c++
target
preprocessor
【解决方案1】:
可以阅读here:
_WIN64 编译目标为 64 位 ARM 时定义为 1 或
x64。否则,未定义。
在任何地方都没有真正的#define。编译器只是根据其编译目标将其添加到其已知定义中。这一切都发生在编译器本身,而不是任何翻译单元(/C++ 文件)中。
【解决方案2】:
该标准规定了每个源文件的九个翻译阶段。编译器需要产生与按顺序执行这九个阶段相同的结果。
第三阶段处理输入解析以产生预处理标记,第四阶段涉及预处理器的执行。预处理器执行后,没有预处理器指令等待编译的后续阶段处理。
那么,从逻辑上讲,像_WIN32 和_WIN64 这样的编译器定义的宏的引入将在第三阶段(生成相关的预处理器令牌,然后由预处理器处理)或在预处理器本身(初始化预处理器设置数据结构,所以宏被神奇地定义了)。
至于特定的编译器是如何做到的,你必须检查编译器的源代码。