Директива #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