РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
39 of 815 menu

Директива #pragma once

Директива #pragma once является нестандартным, но широко поддерживаемым расширением языка C++. Она указывается в начале заголовочного файла и гарантирует, что компилятор обработает содержимое этого файла только при первом его подключении. Если файл будет включен повторно (напрямую или косвенно через другие заголовки), компилятор просто проигнорирует его содержимое. Это избавляет программиста от необходимости использовать классические стражи включения (include guards) на основе #ifndef, #define и #endif.

Синтаксис

#pragma once

Директива не принимает параметров и должна располагаться в самом начале файла, до любого кода или других директив препроцессора.

Пример

Давайте создадим простой заголовочный файл math_utils.h, который защищен директивой #pragma once. В нем объявим функцию сложения двух чисел:

// math_utils.h #pragma once int add(int a, int b) { return a + b; }

Теперь представим, что этот файл подключается дважды в одном и том же файле исходного кода. Благодаря #pragma once компилятор не выдаст ошибку о повторном определении функции add:

#include <iostream> #include "math_utils.h" #include "math_utils.h" using namespace std; int main() { cout << add(2, 3) << endl; return 0; }

Результат выполнения кода:

5

Пример

Рассмотрим случай, когда заголовочный файл содержит определение класса. Без защиты повторное включение привело бы к ошибке компиляции. Создадим файл point.h:

// point.h #pragma once class Point { public: int x; int y; Point(int x, int y) : x(x), y(y) {} };

Подключим этот заголовок несколько раз в основной программе и убедимся, что код работает корректно:

#include <iostream> #include "point.h" #include "point.h" using namespace std; int main() { Point p(1, 2); cout << p.x << " " << p.y << endl; return 0; }

Результат выполнения кода:

1 2

Смотрите также

  • директива include,
    которая подключает файлы в программу
  • директива ifndef,
    которая проверяет, не определен ли макрос
  • директива define,
    которая определяет макрос
  • директива endif,
    которая завершает блок условной компиляции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить