Я выполняю рефакторинг некоторых существующих программ и регулярно вижу это
#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 нет.