У мовах програмування С та C++, #pragma once — нестандартна, однак широкопідтримувана директива препроцесора, створена для того, аби забезпечити включення тіла файлу сирцевого коду (зазвичай заголовного файлу) лише один раз в одній одиниці трансляції. Таким чином, #pragma once виконує ту ж функцію, що і , але з деякими перевагами, зокрема меншою кількістю коду, уникненням колізії імен та прискоренням швидкості компіляції (в окремих випадках).

Приклад Файл «grandparent.h» #pragma once

struct foo { int member; }; Файл «parent.h» #include "grandparent.h" Файл «child.c» #include "grandparent.h" // Буде оброблено визначення структури foo #include "parent.h" // Файл grandparent.h вже не включатиметься

Переваги

Найпоширенішою альтернативою #pragma once є використання директиви #define для створення -макроса, ім'я якого програміст вибирає унікальним для кожного файлу. Наприклад, #ifndef GRANDPARENT_H #define GRANDPARENT_H // ... вміст grandparent.h #endif /* !GRANDPARENT_H */

Це складніший і, можливо, менш ефективний метод. Також він збільшує ризик внесення помилок, оскільки відсутні механізми для запобігання випадковому використанню одного й того ж імені макроса в декількох файлах, у результаті чого лише один з цих файлів буде включено. Цієї проблеми достатньо, щоб використання #pragma once було корисним. Відповідальність за обробку #pragma once лежить на компіляторі, тому програміст не може зробити помилку, яка спричинить конфлікт імен.

Використання #pragma once замість include guards може, для деяких компіляторів, покращити швидкість компіляції, бо це механізм вищого рівня. Компілятор може порівняти імена файлів або їхні inode без необхідності сканування препроцесором C заголовочних файлів у пошуку директив #ifndef та #endif. Важливо відзначити, що такі компілятори, як GCC, Clang та компілятори на основі мають специфічні процедури для розпізнавання та оптимізації обробки include guards, тому використання #pragma once дає невелике прискорення або ж зовсім не сповільнює компіляцію.

Недоліки Ідентифікація того ж файлу на файловій системі може бути непростою задачею. Символьні та, особливо, можуть спричинити те, що один і той же файл існує під різними іменами у різних каталогах. Компілятор може використовувати евристичні методи, які порівнюють розмір, час модифікації та вміст файлів. Це може призвести до протилежного ефекту коли файл скопійовано до різних частин проекту. При виконанні директиви #pragma once ці файли можуть розглядатися як різні або як один і той же компіляторо-залежним чином.

Сумісність Compiler #pragma once Clang підтримується підтримується C++ Builder підтримується (з XE3) Digital Mars C++ підтримується GCC підтримується (з 3.4) підтримується (принаймні з A.06.12) підтримується (з 13.1.1) Intel C++ Compiler підтримується Microsoft Visual C++ підтримується (з 4.2) підтримуєтьсяIDE help/documentation ARM DS-5 підтримується IAR C/C++ підтримується Solaris Studio C/C++ не підтримується

Примітки