Топ питань
Часова шкала
Чат
Перспективи

Pragma once

З Вікіпедії, вільної енциклопедії

Remove ads

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

Remove ads

Приклад

Файл «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 для створення include guard[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 та компілятори на основі EDG[en] мають специфічні процедури для розпізнавання та оптимізації обробки include guards, тому використання #pragma once дає невелике прискорення або ж зовсім не сповільнює компіляцію.[2][3][4]

Remove ads

Недоліки

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

Сумісність

Більше інформації Compiler ...
Remove ads

Примітки

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads