A C és C++ programozási nyelvekben a #pragma Once egy nem szabványos, de széles körben használt előfeldolgozó direktíva , amelynek célja annak vezérlése, hogy egy adott forrásfájl pontosan egyszer szerepeljen a fordítás során. Vagyis #pragma onceugyanazt a célt szolgálja, mint az include guard , de kevesebb kódot igényel, és nem teszi lehetővé a névütközések lehetőségét. A fordítócsomagban a 3.4-es verzió előtti GCC elavultnak minősült, és nem ajánlott használni. [1] A széles körű használat miatt azonban ez a döntés megváltozott. [2]
Az include Guardról szóló cikk példát mutat arra a helyzetre, amikor egy adott módszert kell használnia. A kiút az ott megadott include őr használata; használati eset #pragma oncelehet:
Fájl "nagyapa.h" #pragma egyszer struct foo { int tag ; }; "father.h" fájl #include "nagyapa.h" "child.c" fájl #include "nagyapa.h" #include "father.h"Fordítóprogram | #pragma egyszer |
---|---|
Csengés | igen [3] |
Comeau C/C++ | igen [4] |
C++Builder XE3 | igen [5] |
Digitális Mars C++ | igen [6] |
GCC | Igen [7] (a 3.4-es verzió óta [8] ) |
HP C/aC++ | Igen [9] (legalábbis az A.06.12 verzió óta) |
IBM XL C/C++ | Igen [10] (a 13.1.1-es verzió óta) |
Intel C++ fordító | igen [11] |
Microsoft Visual C++ | Igen [12] (4.2-es verzió óta) |
Pelles C | igen [13] |
ARM DS-5 | igen [14] |
IAR C/C++ | igen [15] |
Solaris Studio C/C++ | Nem [16] [17] |
A #pragma onceguard használata az include helyett sok esetben felgyorsítja a fordítást a magas szintű mechanizmus miatt; a fordító függetlenül tudja összehasonlítani a fájlneveket vagy az inode -okat anélkül, hogy a C előfeldolgozót#ifndef meg kellene hívnia a és a fejléc ellenőrzéséhez #endif.
Másrészt egyes fordítók, mint például a GCC , speciális kódot is használnak az include guardok felismerésére és kezelésének optimalizálására . [egy]
Mivel maga a fordító felel a kezeléséért #pragma once, a programozónak nem kell új neveket létrehoznia, mint pl GRANDFATHER_H. Ez kiküszöböli a névütközések kockázatát, vagyis a fejlécfájl nem okozhat hibát, ha szerepel. Ezenkívül kevesebb szöveget kell beírnia, mint az include védő használatakor.
Az ilyen magas szintű feldolgozás azonban mindkét esetben gyorsabb, de a programozónak bíznia kell a fordító megfelelő feldolgozásában #pragma once. Ha a fordító hibát követ el, például nem ismeri fel azt a helyzetet, amikor két különböző nevű szimbolikus hivatkozás ugyanarra a fájlra mutat, akkor a fordítás meghiúsul. A programhoz kapcsolódó hibákkal rendelkező fordítók az #pragma onceLCC -Win32 2004 -es verziója [18] [19] és a GCC 1998 -as verziója . [1] A GCC eredetileg letiltási figyelmeztetést adott ki, #pragma onceha a lefordított kód ezt használta. A GCC 3.4-es kiadásában azonban a parancsfeldolgozó kódot #pragma onceúgy rögzítették, hogy megfelelően működjön szimbolikus és kemény hivatkozásokkal. Ezt a funkciót hasznosnak ítélték, és a figyelmeztetést eltávolították. [20] [21]
Mindkét parancsot használhatja #pragma once, és védőelemeket is beépíthet hordozható kód írásához, ami szintén előnyös lehet az #pragma onceoptimalizálásból (ha a fordító támogatja):
Fájl "nagyapa.h" #pragma egyszer #ifndef GRANDFATHER_H #define GRANDFATHER_H struct foo { int tag ; }; #endif /* NAGYAPA_H */