Подтвердить что ты не робот

# прагма один раз Versus #if! defined MYHEADER_INCLUDED_

Возможный дубликат:
#pragma once vs включает защитников?

Каковы различия (в производительности, удобстве использования и функциональности) при использовании конструкций #pragma once и #if !defined MYHEADER_INCLUDED_? Или в чем разница между ними?

4b9b3361

Ответ 1

В Википедии есть все ваши ответы для этого и достаточно легко найти

Из статьи

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

Таким образом, #pragma once служит той же цели, что и #include охранники, но с     несколько преимуществ, в том числе: меньше кода, избегая конфликтов имен и     улучшенная скорость компиляции.

В нем более подробно рассмотрены преимущества и недостатки статьи . Если вы действительно заинтересованы, я предлагаю вам прочитать его полностью, а не только рекламу выше.

Ответ 2

  • производительность - обычно реализация #pragma once компилируется быстрее, потому что это намерение ясно.
  • функциональность - обе служат той же цели - избегать более одного включения файла заголовка. Версия defined имеет, конечно же, более широкое применение, и если она будет использована, она будет проверять другой файл, если бы он был включен (например, для условной компиляции).
  • удобство использования - если переносимость не является проблемой, переходите к #pragma once - однако это расширение нестандартное

Ответ 3

В то время как прагма во многих аспектах превосходит защитников #ifdef, у него есть один главный недостаток: он основан на путях файловой системы: он использует основное предположение, что два разных (абсолютных) пути также являются двумя разными файлами. К сожалению, это не всегда так.

В то время как маловероятно, что у вас возникнут проблемы с этим, это то, о чем нужно знать.

Ответ 4

Дополнительные сведения об этом:

Ответ 5

Что касается производительности, я ее не оценил, но он широко сообщал, что компиляторы признают идиому защиты #include и не открывают/повторно обрабатывают файлы, которые ее используют (поэтому относиться к ним так же, как к использованию #pragma once).

Помимо этого потенциального преимущества производительности (которого, вероятно, не существует), я мало что вижу, что #pragma once предлагает - он несколько более удобен при создании нового заголовка, но охранники действительно не настолько обременительны, чтобы их можно было внедрить, Поскольку #pragma once не особенно убедительна, и, поскольку я все еще иногда имею дело с компилятором, который его не поддерживает, я использую защитные устройства.

Если бы было показано, что #pragma once имеет значительный эффект производительности, я бы, конечно, начал его использовать.

Тем не менее, я хотел бы, чтобы C был определен только для включения заголовков один раз - если не был вызван какой-либо механизм, указывающий, что заголовок должен обрабатываться каждый раз, когда он был включен. Время, когда вы хотите, чтобы такое поведение было далеко, далеко не пронумеровано тем временем, когда вы этого не сделали (и я все время встречаю заголовки каждый раз и снова, у которых нет охранников или #pragma once). Но это не было определено таким образом, поэтому включить охранников это...

Ответ 6

Как Дэн Макг сказал, что они почти такие же. Но я не рекомендую использовать #pragma, кроме случаев, когда вы избегаете вещей (например, раздел #pragma). Просто сделайте код более нестандартным.

И проблема с функциональностью/производительностью отсутствует. Потому что это время компиляции. Это может увеличить время компиляции, но я не испытал никакой разницы!

Ответ 7

#pragma once является нестандартным.

Если вы довольны перспективой изменения каждого из ваших файлов заголовков, когда вы обнаружите, что ваше приложение или библиотека не будут создавать, когда вы попытаетесь перенести его на другую платформу, это, вероятно, хороший выбор.

В противном случае придерживайтесь #ifndef/#define/#endif. Особенно, если вы создаете код библиотеки для других людей.