#在#include预编译标头之前#定义XYZ

Iva*_*van 3 c++ pch visual-studio

我正在重构一些现有软件,并且经常看到

#define XYZ 
#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

stdafx预编译的头文件在哪里。

Q1。知识渊博的人可以确认以下内容吗?正确的顺序始终是
(除了文件之外stdafx.cpp

#include "stdafx.h"
#define XYZ 
Run Code Online (Sandbox Code Playgroud)

我的推理如下。由于标头是预编译的,因此即使已在标头中使用,在预编译的标头之前的定义也不会影响预编译的标头。预编译头将使用XYZ初始编译发生时设置为宏的任何内容。

所以

#define XYZ 
#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

误导读者进行思考XYZ可能对内容产生影响stdafx.h

Q2。两者在功能上是否等效,我的重构是否安全?

#include "stdafx.h"
#define XYZ 
Run Code Online (Sandbox Code Playgroud)

明确定义,XYZ而替代方案没有那么明确定义。(据我所知,使用预编译头很可能会被某些编译器覆盖该定义。)但是XYZ在包含预编译头之前进行定义似乎确实可行,因为它在重构的代码中经常出现。

Q3。行为是否在标准中定义?

如果我是编译器作者,那么#define在包含预编译头之前,我将拒绝任何内容!我的VS2019没有。

Pau*_*ans 6

您声明:

因为标头是预编译的,所以即使在标头内部使用“预编译”标头之前的定义也不会影响预编译的标头。

但是从Microsoft文档的Precompiled头文件中

[#defines]在创建预编译头文件的编译文件和当前编译文件之间必须相同。未检查已定义常量的状态,但是如果您的文件依赖于更改后的常量的值,则可能会发生不可预测的结果。