#define XYZ перед #include предварительно скомпилированный заголовок - PullRequest
3 голосов
/ 02 июля 2019

Я выполняю рефакторинг некоторых существующих программ и регулярно вижу это

#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 Ответ

6 голосов
/ 02 июля 2019

Вы заявляете:

Определение перед предварительно скомпилированным заголовком не может повлиять на предварительно скомпилированный заголовок, даже если «используется» внутри заголовка, так как заголовок предварительно скомпилирован.

Но из документации Microsoft Скомпилированные заголовочные файлы :

[# define] Должно быть одинаковым между компиляцией, которая создала предварительно скомпилированный заголовок, и текущей компиляцией. Состояние определенных констант не проверяется, но непредсказуемые результаты могут возникнуть, если ваши файлы зависят от значений измененных констант.

...