Правилното заглавие на статията е #pragma once. Знакът # е пропуснат поради технически ограничения.

В езиците за програмиране C и C++, #pragma once е нестандартна, но широко поддържана препроцесорна директива, предназначена да наложи ограничение за даден файл да бъде добавен (include) само веднъж по време на компилацията. По този начин #pragma once служи за същите цели като include guard-овете, но с няколко предимства, включващи: по-малко код, избягване на имеви сблъсъци и бързина при компилиране.

Пример с използването на #pragma once би изглеждал така:

File "grandfather.h"
#pragma once

struct foo {
    int member;
};
File "father.h"
#include "grandfather.h" // добавяме grandfather.h веднъж във father.h, този include няма да бъде изпълнен.
File "child.c"
#include "grandfather.h" // тук го добавяме отново
#include "father.h" // след което добавяме father.h където преди това сме добавили grandfather.h

Предимства и недостатъци редактиране

Използвайки #pragma once вместо "include guards" обикновено ще доведе до подобряване скоростта на компилиране, защото е механизъм от високо ниво; Компилаторът сам може да сравянява имената на файловете или inode-овете без да му се налага да извиква C preprocessor-а за да сканира заглавните файлове за #ifndef и #endif.

След като компилаторът е отговорен за спазването/изпълнението на #pragma once, на програмиста не му се налага да създава макроси с имена като GRANDFATHER_H показани в примера от статията за Include guard. По този начин се премахва рискът от имеви сблъсъци, което означава, че практически нито един файл няма да бъде пропуснат по време на компилацията. Друго предимство е по-малкото код, който програмистът трябва да напише в сравнение с "include guards" метода.

Бележка: Някои компилатори като GCC включват специално оптимизиран код за разпознаване и оптимизиране на "include guards"-ове, затова е възможно минимално или никакво подобрение в скоростта на компилиране при използването на #pragma once.[1] След като компилаторът е отговорен за изпълнението на #pragma once, това налага зависимост на кода и несъвместимост с компилаторите без поддръжка на #pragma once.

В този случай, може да използвате и двата метода #pragma once и "include guards" за да направите кода съвместим и да се възползвате от оптимизацията при компилиране с компилаторите поддържащи #pragma once;

Пример с използването на двата метода би изглеждал така:

File "grandfather.h"
#pragma once // за компилатори, които поддръжат директивата

#ifndef GRANDFATHER_H // за тези които нямат поддръжка на #pragma once
#define GRANDFATHER_H

struct foo {
    int member;
};

#endif /* GRANDFATHER_H */

Източници редактиране

  1. The C Preprocessor: 1. The C Preprocessor // gcc.gnu.org. Посетен на 28 януари 2022.

Външни препратки редактиране

    Тази страница частично или изцяло представлява превод на страницата Pragma once в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите. ​

ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни.​