У мовах програмування С та , #pragma once
— нестандартна, однак широкопідтримувана директива препроцесора, створена для того, аби забезпечити включення тіла файлу сирцевого коду (зазвичай заголовного файлу) лише один раз в одній одиниці трансляції. Таким чином, #pragma once
виконує ту ж функцію, що і [en], але з деякими перевагами, зокрема меншою кількістю коду, уникненням колізії імен та прискоренням швидкості компіляції (в окремих випадках).
Приклад
- Файл «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
для створення [en]-макроса, ім'я якого програміст вибирає унікальним для кожного файлу. Наприклад,
#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 та компілятори на основі [en] мають специфічні процедури для розпізнавання та оптимізації обробки include guards
, тому використання #pragma once
дає невелике прискорення або ж зовсім не сповільнює компіляцію.
Недоліки
Ідентифікація того ж файлу на файловій системі може бути непростою задачею. Символьні та, особливо, [en] можуть спричинити те, що один і той же файл існує під різними іменами у різних каталогах. Компілятор може використовувати евристичні методи, які порівнюють розмір, час модифікації та вміст файлів. Це може призвести до протилежного ефекту коли файл скопійовано до різних частин проекту. При виконанні директиви #pragma once
ці файли можуть розглядатися як різні або як один і той же компіляторо-залежним чином.
Сумісність
Compiler | #pragma once |
---|---|
Clang | підтримується |
[en] | підтримується |
підтримується (з XE3) | |
підтримується | |
GCC | підтримується (з 3.4) |
[en] | підтримується (принаймні з A.06.12) |
[en] | підтримується (з 13.1.1) |
підтримується | |
підтримується (з 4.2) | |
[it] | підтримується |
підтримується | |
IAR C/C++ | підтримується |
Solaris Studio C/C++ | не підтримується |
Примітки
- Noel Llopis (25.01.2005). . Games from Within. Архів оригіналу за 30.09.2008. Процитовано 19.08.2013.
- . Gcc.gnu.org. 1 лютого 1996. Архів оригіналу за 25 квітня 2007. Процитовано 19 серпня 2013.
- . Clang.llvm.org. Архів оригіналу за 6 серпня 2013. Процитовано 19 серпня 2013.
- . Clang.llvm.org. Архів оригіналу за 11 листопада 2013. Процитовано 19 серпня 2013.
- . Gcc.gnu.org. Архів оригіналу за 10 липня 2010. Процитовано 19 серпня 2013.
- should_stack_file() function in GCC source code.
- . Clang.llvm.org. Архів оригіналу за 4 квітня 2014. Процитовано 19 серпня 2013.
- . Comeaucomputing.com. Архів оригіналу за 11 грудня 2013. Процитовано 19 серпня 2013.
- . Docwiki.embarcadero.com. 2 грудня 2010. Архів оригіналу за 12 грудня 2013. Процитовано 19 серпня 2013.
- . Digital Mars. Архів оригіналу за 12 грудня 2013. Процитовано 19 серпня 2013.
- . Gcc.gnu.org. Архів оригіналу за 4 березня 2016. Процитовано 20 серпня 2013.
- . Архів оригіналу за 23 червня 2016. Процитовано 14 травня 2016.
- . IBM. Архів оригіналу за 4 березня 2016. Процитовано 20 лютого 2015.
- . Intel Developer Zones. Архів оригіналу за 11 грудня 2013. Процитовано 4 грудня 2013.
- . Msdn.microsoft.com. Архів оригіналу за 10 серпня 2016. Процитовано 19 серпня 2013.
- IDE help/documentation
- . ARM. Архів оригіналу за 7 жовтня 2016. Процитовано 17 грудня 2013.
- (PDF). IAR Systems. Архів оригіналу (PDF) за 16 травня 2017. Процитовано 4 грудня 2013.
- . Oracle. Архів оригіналу за 9 жовтня 2016. Процитовано 20 лютого 2015.
- . Oracle. Архів оригіналу за 4 березня 2016. Процитовано 20 лютого 2015.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U movah programuvannya S ta C b pragma once b nestandartna odnak shirokopidtrimuvana direktiva preprocesora stvorena dlya togo abi zabezpechiti vklyuchennya tila fajlu sircevogo kodu zazvichaj zagolovnogo fajlu lishe odin raz v odnij odinici translyaciyi Takim chinom pragma once vikonuye tu zh funkciyu sho i en ale z deyakimi perevagami zokrema menshoyu kilkistyu kodu uniknennyam koliziyi imen ta priskorennyam shvidkosti kompilyaciyi v okremih vipadkah PrikladFajl grandparent h pragma once struct foo int member Fajl parent h include grandparent h Fajl child c include grandparent h Bude obrobleno viznachennya strukturi foo include parent h Fajl grandparent h vzhe ne vklyuchatimetsyaPerevagiNajposhirenishoyu alternativoyu pragma once ye vikoristannya direktivi define dlya stvorennya en makrosa im ya yakogo programist vibiraye unikalnim dlya kozhnogo fajlu Napriklad ifndef GRANDPARENT H define GRANDPARENT H vmist grandparent h endif GRANDPARENT H Ce skladnishij i mozhlivo mensh efektivnij metod Takozh vin zbilshuye rizik vnesennya pomilok oskilki vidsutni mehanizmi dlya zapobigannya vipadkovomu vikoristannyu odnogo j togo zh imeni makrosa v dekilkoh fajlah u rezultati chogo lishe odin z cih fajliv bude vklyucheno Ciyeyi problemi dostatno shob vikoristannya pragma once bulo korisnim Vidpovidalnist za obrobku pragma once lezhit na kompilyatori tomu programist ne mozhe zrobiti pomilku yaka sprichinit konflikt imen Vikoristannya pragma once zamist include guards mozhe dlya deyakih kompilyatoriv pokrashiti shvidkist kompilyaciyi bo ce mehanizm vishogo rivnya Kompilyator mozhe porivnyati imena fajliv abo yihni inode bez neobhidnosti skanuvannya preprocesorom C zagolovochnih fajliv u poshuku direktiv ifndef ta endif Vazhlivo vidznachiti sho taki kompilyatori yak GCC Clang ta kompilyatori na osnovi en mayut specifichni proceduri dlya rozpiznavannya ta optimizaciyi obrobki include guards tomu vikoristannya pragma once daye nevelike priskorennya abo zh zovsim ne spovilnyuye kompilyaciyu NedolikiIdentifikaciya togo zh fajlu na fajlovij sistemi mozhe buti neprostoyu zadacheyu Simvolni ta osoblivo en mozhut sprichiniti te sho odin i toj zhe fajl isnuye pid riznimi imenami u riznih katalogah Kompilyator mozhe vikoristovuvati evristichni metodi yaki porivnyuyut rozmir chas modifikaciyi ta vmist fajliv Ce mozhe prizvesti do protilezhnogo efektu koli fajl skopijovano do riznih chastin proektu Pri vikonanni direktivi pragma once ci fajli mozhut rozglyadatisya yak rizni abo yak odin i toj zhe kompilyatoro zalezhnim chinom SumisnistCompiler pragma once Clang pidtrimuyetsya en pidtrimuyetsya C Builder pidtrimuyetsya z XE3 Digital Mars C pidtrimuyetsya GCC pidtrimuyetsya z 3 4 en pidtrimuyetsya prinajmni z A 06 12 en pidtrimuyetsya z 13 1 1 Intel C Compiler pidtrimuyetsya Microsoft Visual C pidtrimuyetsya z 4 2 it pidtrimuyetsya pidtrimuyetsya IAR C C pidtrimuyetsya Solaris Studio C C ne pidtrimuyetsyaPrimitkiNoel Llopis 25 01 2005 Games from Within Arhiv originalu za 30 09 2008 Procitovano 19 08 2013 Gcc gnu org 1 lyutogo 1996 Arhiv originalu za 25 kvitnya 2007 Procitovano 19 serpnya 2013 Clang llvm org Arhiv originalu za 6 serpnya 2013 Procitovano 19 serpnya 2013 Clang llvm org Arhiv originalu za 11 listopada 2013 Procitovano 19 serpnya 2013 Gcc gnu org Arhiv originalu za 10 lipnya 2010 Procitovano 19 serpnya 2013 should stack file function in GCC source code Clang llvm org Arhiv originalu za 4 kvitnya 2014 Procitovano 19 serpnya 2013 Comeaucomputing com Arhiv originalu za 11 grudnya 2013 Procitovano 19 serpnya 2013 Docwiki embarcadero com 2 grudnya 2010 Arhiv originalu za 12 grudnya 2013 Procitovano 19 serpnya 2013 Digital Mars Arhiv originalu za 12 grudnya 2013 Procitovano 19 serpnya 2013 Gcc gnu org Arhiv originalu za 4 bereznya 2016 Procitovano 20 serpnya 2013 Arhiv originalu za 23 chervnya 2016 Procitovano 14 travnya 2016 IBM Arhiv originalu za 4 bereznya 2016 Procitovano 20 lyutogo 2015 Intel Developer Zones Arhiv originalu za 11 grudnya 2013 Procitovano 4 grudnya 2013 Msdn microsoft com Arhiv originalu za 10 serpnya 2016 Procitovano 19 serpnya 2013 IDE help documentation ARM Arhiv originalu za 7 zhovtnya 2016 Procitovano 17 grudnya 2013 PDF IAR Systems Arhiv originalu PDF za 16 travnya 2017 Procitovano 4 grudnya 2013 Oracle Arhiv originalu za 9 zhovtnya 2016 Procitovano 20 lyutogo 2015 Oracle Arhiv originalu za 4 bereznya 2016 Procitovano 20 lyutogo 2015