http://en.wikipedia.org/wiki/Pragma_once
Должен ли я использовать include guard, когда все эти компиляторы поддерживают #pragma once
?
Многие ответы о переполнении стека говорят о том, чтобы использовать оба для совместимости, но я не уверен, что это все еще звучит правдоподобно.
То, что сегодня не поддерживают компиляторы #pragma once
?
Я не уверен, что использование обоих было просто рекомендацией до того, как они стали утвержденными, или есть все еще очень веские причины для использования обоих методов.
Любые примеры использования только #pragma once
вызовет проблемы?
Это зависит от того, насколько переносимой будет ваша программа.
Пока вы пишете программу, которая должна работать с компиляторами, которые вы точно знаете, поддерживает #prama once
, просто используя #pragma once
должно хватить. Но при этом вы ограничиваете свою программу набором компиляторов, которые поддерживают функцию, определяемую реализацией.
Если вам нужна ваша программа для работы на все компиляторы тогда вы должны использовать #pragma once
и включить охранников обоих.
В случае, если компилятор не поддерживает #pragma once
это просто проигнорирует это[Ссылка 1], в таком случае средства защиты заголовков будут служить вам цели, поэтому нет ничего плохого в том, чтобы использовать их оба, когда вы не знаете о функциях, поддерживаемых вашими целевыми компиляторами.
Поэтому, если вы хотите, чтобы ваша программа была на 100% переносимой на разных компиляторах, идеальным способом по-прежнему будет использовать только встроенные средства защиты. Как справедливо указывает @CharlesBailey, поскольку поведение #pragma once
Если реализация определена, поведение неизвестного компилятора может оказать пагубное влияние на вашу программу.
[Ссылка 1]
Стандарт C ++ 03: 16.6 Прагма директива
Директива предварительной обработки вида
# pragma pp-tokensopt new-line
заставляет реализацию вести себя в зависимости от реализации. Любая прагма, которая не распознается реализацией, игнорируется.
Это нестандартно, так что если вы хотите быть в безопасности, используйте защитные щитки
Как видно из таблицы, в настоящее время очень редко встречается компилятор, который не поддерживает #pragma once
, Поддержание чистоты и дешевизны кода требует постоянных усилий по рефакторингу. Необходимость обновления включать элементы защиты каждый раз, когда вы переименовываете класс или перемещаете некоторый код, добавляет значительную нагрузку к этим усилиям.
Так что я бы сказал, кроме некоторых нишевых угловых случаев или для сломанных систем сборки #pragma once
на практике безопасно полагаться. Если вы заботитесь о производительности и качестве кода, используя только #pragma once
кажется очевидным выбором.
Исключение составляют случаи, когда вы пишете библиотеку, которая должна поддерживать каждый компилятор под солнцем, или вам не повезло работать с одним из этих редких компиляторов, который не имеет этой функции.