once
pragma
Указывает, что компилятор включает файл заголовка только один раз при компиляции файла исходного кода.
Синтаксис
#pragma once
Замечания
Использование может сократить время сборки #pragma once
, так как компилятор не откроет и снова считывает файл после первого #include
файла в модуле перевода. Она называется оптимизацией с несколькими включениями. Он имеет эффект, аналогичный идиому охранника , который использует определения макросов препроцессора для предотвращения нескольких включений содержимого файла. Это также помогает предотвратить нарушения одного правила определения: требование, что все шаблоны, типы, функции и объекты не имеют более одного определения в коде.
Например:
// header.h
#pragma once
// Code placed here is included only once per translation unit
Мы рекомендуем директиву #pragma once
для нового кода, так как она не засоряет глобальное пространство имен символами препроцессора. Он требует меньше ввода, это менее отвлекает, и он не может вызвать столкновения символов. Столкновения символов являются ошибками, вызванными, когда разные файлы заголовков используют один и тот же символ препроцессора, что и значение охранника. Он не является частью стандарта C++, но он реализуется переносимо несколькими общими компиляторами.
Нет преимуществ использования идиомы #pragma once
guard и в одном и том же файле. Компилятор распознает идиом include guard и реализует оптимизацию с несколькими включениями так же, как #pragma once
и директива, если код без комментариев или директива препроцессора не выполняется до или после стандартной формы идиома:
// header.h
// Demonstration of the #include guard idiom.
// Note that the defined symbol can be arbitrary.
#ifndef HEADER_H_ // equivalently, #if !defined HEADER_H_
#define HEADER_H_
// Code placed here is included only once per translation unit
#endif // HEADER_H_
Рекомендуется включить идиом guard, если код должен быть переносим для компиляторов, которые не реализуют #pragma once
директиву, для обеспечения согласованности с существующим кодом или когда оптимизация с несколькими включениями невозможна. Это может происходить в сложных проектах, когда псевдоним файловой системы или псевдонимы включают пути, чтобы компилятор не идентифицировать идентичные файлы по каноническому пути.
Будьте осторожны, чтобы не использовать #pragma once
или включить idiom guard в файлы заголовков, предназначенные для включения несколько раз, которые используют символы препроцессора для управления их эффектами. Пример этого проекта см. в файле заголовка <assert.h> . Кроме того, будьте осторожны, чтобы управлять путями включения, чтобы избежать создания нескольких путей к включенным файлам, что может победить оптимизацию с несколькими включениями как для охранников, так и #pragma once
.