我正在重构一些现有的软件,并且经常看到
#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没有。
答案 0 :(得分:6)
您声明:
因为标头是预编译的,所以即使在标头中使用了预编译头之前的定义也不会影响预编译头。
但是根据Microsoft文档Precompiled Header Files:
[#defines]在创建预编译头文件的编译文件和当前编译文件之间必须相同。未检查已定义常量的状态,但是如果您的文件依赖于更改后的常量的值,则可能会发生不可预测的结果。