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

时间:2019-07-02 11:48:18

标签: c++ visual-studio pch

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

#define XYZ 
#include "stdafx.h"

其中stdafx是预编译的头文件。

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

#include "stdafx.h"
#define XYZ 

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

所以

#define XYZ 
#include "stdafx.h"

误导读者认为XYZ可能会对stdafx.h的内容产生影响。

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

#include "stdafx.h"
#define XYZ 

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

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

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

1 个答案:

答案 0 :(得分:6)

您声明:

  

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

但是根据Microsoft文档Precompiled Header Files

  

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