Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Указывает, что компилятор включает файл заголовка только один раз при компиляции файла исходного кода.
Синтаксис
#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.
См. также
директивы Pragma и ключевые слова __pragma и _Pragma