Является ли #pragma безопасным включением охраны? - PullRequest
265 голосов
/ 25 апреля 2009

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

Поддерживается ли это большинством современных компиляторов на платформах, отличных от Windows (gcc)?

Я хочу избежать проблем с компиляцией платформы, но также хочу избежать дополнительной работы защитников:

#pragma once
#ifndef HEADER_H
#define HEADER_H

...

#endif // HEADER_H

Должен ли я быть обеспокоен? Должен ли я потратить на это еще какую-нибудь умственную энергию?

Ответы [ 14 ]

2 голосов
/ 04 марта 2010

В наши дни охранники старой школы так же быстры, как и #pragma. Даже если компилятор не обрабатывает их специально, он все равно остановится, когда увидит #ifndef WHATEVER и WHATEVER. Открытие файла сегодня очень дешево. Даже если бы было улучшение, оно было бы порядка миллисекунд.

Я просто не использую #pragma один раз, так как это не приносит никакой пользы. Чтобы избежать столкновения с другими включенными охранниками, я использую что-то вроде: CI_APP_MODULE_FILE_H -> CI = Company Initials; APP = название приложения; остальное не требует объяснений.

2 голосов
/ 25 апреля 2009

Используя gcc 3.4 и 4.1 на очень больших деревьях (иногда используя distcc ), мне еще предстоит увидеть какое-либо ускорение при использовании #pragma вместо или в сочетании со стандартными защитниками включения .

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

Я бы тоже хотел, чтобы он был принят на ранней стадии, но я вижу аргумент "Зачем нам это нужно, если ifndef работает отлично?" Учитывая много темных углов и сложностей С, включить охранников - одна из самых простых, самоочевидных вещей. Если у вас есть хотя бы небольшие знания о том, как работает препроцессор, они должны быть понятны.

Если вы заметили значительное ускорение, обновите ваш вопрос.

1 голос
/ 14 июня 2017

Дополнительное примечание для людей, думающих, что автоматическое одноразовое включение заголовочных файлов всегда желательно: я строю генераторы кода, использующие двойное или множественное включение заголовочных файлов с десятилетий. Специально для создания заглушек библиотеки протоколов мне очень удобно иметь чрезвычайно портативный и мощный генератор кода без дополнительных инструментов и языков. Я не единственный разработчик, использующий эту схему, как показывает этот блог X-Macros . Этого нельзя было бы сделать без отсутствующей автоматической охраны.

1 голос
/ 14 сентября 2013

Если мы используем msvc или Qt (до Qt 4.5), так как GCC (до 3.4), msvc оба поддерживают #pragma once, я не вижу причин, чтобы не использовать #pragma once.

Имя исходного файла обычно совпадает с именем класса, и мы знаем, что иногда нам нужно refactor , чтобы переименовать имя класса, тогда нам также пришлось изменить #include XXXX, поэтому я думаю, что руководство поддерживает 1008 * не умная работа. даже с расширением Visual Assist X поддерживать «xxxx» не обязательно.

...