pragma once

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене
Правилното заглавие на статията е #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

Предимства и недостатъци[редактиране | edit source]

Използвайки #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 */

Източници[редактиране | edit source]

Външни препратки[редактиране | edit source]

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