Существует небольшая разница в том, что если SOME_HEADER_H
уже определено до включения заголовка, то во втором случае препроцессор обработает #pragma once
, а в первом случае - нет.
Вы увидите функциональную разницу, если вы #undef SOME_HEADER_H
включите файл снова с тем же TU:
#define SOME_HEADER_H
#include "some_header.h"
#undef SOME_HEADER_H
#include "some_header.h"
Теперь, в случае 1 у меня есть все определения из файла заголовка.В случае 2 я не знаю.
Даже без #undef
вы могли бы видеть разницу во времени предварительной обработки из-за игнорирования #pragma once
в случае 1. Это зависит от реализации.
Я могу придумать два вероятных способа, которыми это могло быть уже определено до первого включения этого заголовочного файла:
- (очевидный) его определяет совершенно отдельный файл, либо намеренноили по случайному совпадению имен,
- копия этого файла уже определила его.В зависимости от реализации это может включать случай, когда этот файл включается в один и тот же TU под двумя разными именами файлов, например, из-за символической ссылки или слияния файловой системы.Если ваша реализация поддерживает
#pragma once
, и вы внимательно изучите ее документацию, вы сможете найти однозначное утверждение, применяется ли оптимизация по пути, по которому включен файл, или путем сравнения чего-либо, что идентифицирует хранилище файлакак номер инода.Если последнее, вы даже сможете выяснить, есть ли еще мошенники, которые можно использовать для обмана препроцессора, например, удаленное монтирование локальной файловой системы, чтобы скрыть, что это «тот же самый файл» ...
Используется ожидаемым образом, однако нет никакой разницы при условии, что реализация обрабатывает #pragma once
в том смысле, в котором ее определяет Microsoft.Пока он обрабатывается, а не пропускается, он помечает содержащий файл для оптимизации, поэтому не имеет значения, будет ли он обрабатываться при втором проходе через файл - второй проход не произойдет.
И, разумеется, поскольку прагма нестандартна, по крайней мере, теоретически она может иметь совершенно разные значения для разных реализаций, и в этом случае может иметь значение, когда и сколько раз она обрабатывается.На практике можно подумать, что никто этого не сделает.