Pragma once

Pragma once
Правильный заголовок этой статьи — #pragma once. Он показан некорректно из-за технических ограничений.

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

В статье об include guard приводится пример ситуации, в которой нужно использовать тот или иной метод. Выходом является использование include guard, приведенное там же; Вариантом использования #pragma once может быть:

File «grandfather.h»
#pragma once
 
struct foo {
    int member;
};
File «father.h»
#include "grandfather.h"
File «child.c»
#include "grandfather.h"
#include "father.h"

Достоинства и недостатки

Применение #pragma once вместо include guard увеличит скорость компиляции во многих случаях благодаря высокоуровневому механизму; компилятор может самостоятельно сравнивать имена файлов или inode'ы без необходимости вызова препроцессора Си для проверки заголовка на наличие #ifndef и #endif.

С другой стороны, некоторые компиляторы, как например, GCC, также использует специальный код для распознавания и оптимизации обработки include guard.[1]

Из-за того, что компилятор сам по себе отвечает за обработку #pragma once, программисту нет необходимости создавать новые имена, как например, GRANDFATHER_H в примере статьи об Include guard. Это исключает риск коллизии имён, то есть заголовочный файл не сможет вызвать ошибку при его подключении. Также приходится меньше набирать текст, нежели при использовании include guard.

Тем не менее, такая высокоуровневая обработка ускоряется в обоих случаях, но программисту приходится полагаться на корректную обработку компилятором #pragma once. Если компилятор совершает ошибку, например, не может распознать ситуацию, когда две символьные ссылки с различными именами указывают на один и тот же файл, то компиляция завершается с ошибкой. Компиляторы, содержащие ошибки, связанные с #pragma once, используются в LCC-Win32 версии 2004 года[2][3] и GCC версии 1998 года.[1] GCC первоначально выдавал предупреждение об отключении #pragma once, если компилируемый код использовал её. Тем не менее, в релизе 3.4 GCC код обработки команды #pragma once был исправлен для корректной работы с символьными и жёсткими ссылками. Данная возможность была сочтена полезной и предупреждение было убрано.[4][5]

Можно использовать обе команды, #pragma once и include guards, для написания переносимого кода, что также может принести выгоду от применения #pragma once при оптимизации (если компилятор её поддерживает):

File «grandfather.h»
#pragma once
#ifndef GRANDFATHER_H
#define GRANDFATHER_H
 
struct foo
{
    int member;
};
 
#endif /* GRANDFATHER_H */

Примечания

Дополнительные источники


Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Полезное


Смотреть что такое "Pragma once" в других словарях:

  • Pragma once — Saltar a navegación, búsqueda El título de este artículo se muestra incorrectamente debido a limitaciones técnicas. El título correcto es #pragma once. Del Lenguaje de programación C y C++, #pragma once es una directiva de Preprocesador de C no… …   Wikipedia Español

  • Pragma once — In the C and C++ programming languages, #pragma once is a non standard but widely supported preprocessor directive designed to cause the current source file to be included only once in a single compilation. Thus, #pragma once serves the same… …   Wikipedia

  • Include Guard — Der Include Guard (dt: Include Wächter) ist eine Programmiertechnik, um in C oder C++ das Problem der doppelten Einbindung (engl.: double inclusion) zu umgehen. Dieses Problem tritt auf, wenn innerhalb eines Moduls mehrfach die gleiche Header… …   Deutsch Wikipedia

  • C preprocessor — The C preprocessor (cpp) is the preprocessor for the C and C++ computer programming languages. The preprocessor handles directives for source file inclusion (#include), macro definitions (#define), and conditional inclusion (#if). In many C… …   Wikipedia

  • Undefined behavior — In computer programming, undefined behavior is a feature of some programming languages most famously C.[1] In these languages, to simplify the specification and allow some flexibility in implementation, the specification leaves the results of… …   Wikipedia

  • Include guard — In the C and C++ programming languages, an #include guard, sometimes called a macro guard, is a particular construct used to avoid the problem of double inclusion when dealing with the #include directive. The addition of #include guards to a… …   Wikipedia

  • Include guard — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей …   Википедия

  • Заголовочный файл — (иногда головной файл, англ. header file), или подключаемый файл  в языках программирования файл, механически «вставляемый» компилятором в исходный текст в том месте, где располагается некоторая директива ({$I file.inc} в Паскале,… …   Википедия

  • Препроцессор Си — Препроцессор С/С++  программный инструмент, изменяющий код программы для последующей компиляции и сборки, используемый в языках программирования Си и его потомка C++. Этот препроцессор обеспечивает использование стандартного набора… …   Википедия

  • Header file — In computer programming, particularly in the C and C++ programming languages, a header file or include file is a file, usually in the form of source code, that is automatically included in another source file by the compiler. Typically, header… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»