Защита от множественного подключения заголовочного файла

262
19 октября 2021, 21:30

Какой метод лучше использовать:

#pragma once 

или

#ifndef XXX_H
#define XXX_H
...
#endif
Answer 1

У обоих методов есть свои преимущества и недостатки.

#define кроссплатформенный, соответствует стандарту, поддерживается всеми компиляторами, но у него есть очевидный недостаток: если в проекте случайно найдутся два header-файла с одинаковым именем, необъяснимые ошибки гарантированы. Особенно неприятно это в случае больших проектов с 3rdparty-кодом. Можно придумать более продвинутую схему, при которой вероятность коллизии уменьшится (например, включать в guard полный путь к файлу в проекте или UUID), но гарантии вам никто не даст. (И вы не сможете потребовать от разработчиков посторонних библиотек следовать вашему стандарту.)

#pragma once лишено этих недостатков, потому что теперь ваше намерение прямо сообщается компилятору, а не посредством маломощного препроцесора. Но этот формат поддерживается не всеми компиляторами, поэтому наверняка будут проблемы с портируемостью.

Тем не менее, #pragma once поддерживается большим количеством компиляторов, так что если вы рассчитываете лишь на популярные компиляторы (MSVC, GCC, Clang, Intel compiler) свежих версий, имеет смысл остановиться на этом варианте. Имейте в виду, что многие опытные Unix-разработчики недолюбливают #pragma once, так что вам придётся обосновывать свой выбор.

Если ваш код есть часть какого-либо проекта, всё становится проще: просто спросите руководителя проекта о том, что рекомендуется к использованию. Выбор между include guard и #pragma once — часть coding standards любого проекта.

READ ALSO
Как заставить класс узнать про экземпляр другого класса?

Как заставить класс узнать про экземпляр другого класса?

У меня есть класс BinTree, описывающий бинарное дерево поиска:

197
шаблонные классы в разных файлах [дубликат]

шаблонные классы в разных файлах [дубликат]

написал на взгляд ОБСОЛЮТНО рабочий код, но он не работает(

115
Не удается открыть файл включение: No such file or directory QT CREATOR

Не удается открыть файл включение: No such file or directory QT CREATOR

Пишу приложение, использую qt creator в качестве ide, и понадобилось мне использовать SFML, но возникла проблема: вpro файл добавил код для подключения...

214
Семафор (теория)

Семафор (теория)

Представим у нас есть разделяемый буфер размером в 4 записи

164