#pragma однажды По сравнению с #if! определенный MYHEADER_INCLUDED_ [дубликат]

12
задан Community 23 May 2017 в 12:13
поделиться

7 ответов

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

Из статьи

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

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

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

16
ответ дан 2 December 2019 в 04:16
поделиться
  1. производительность - обычно реализация #pragma once компилируется быстрее, потому что ее цель ясна
  2. функциональность - обе служат одной цели - чтобы избежать более одного включение файла заголовка. Определенная версия , конечно, также имеет более широкое применение, и при осторожном использовании позволит проверить в другом файле, был ли включен первый (например, для условной компиляции)
  3. удобство использования - если переносимость не проблема иди с #pragma once - однако это нестандартное расширение
7
ответ дан 2 December 2019 в 04:16
поделиться

Еще немного предыстории:

3
ответ дан 2 December 2019 в 04:16
поделиться

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

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

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

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

2
ответ дан 2 December 2019 в 04:16
поделиться

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

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

1
ответ дан 2 December 2019 в 04:16
поделиться

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

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

5
ответ дан 2 December 2019 в 04:16
поделиться

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

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

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

1
ответ дан 2 December 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: