Pragma egyszer

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ó támogatás

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]

Előnyök és hátrányok

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 */

Jegyzetek

  1. 1 2 3 A C előfeldolgozó. Csak egyszer használható fájlok . Letöltve: 2008. június 6. Az eredetiből archiválva : 2013. augusztus 7..
  2. 11569-es hiba – a #pragma egyszer nem helyettesíthető . Hozzáférés dátuma: 2013. december 21. Az eredetiből archiválva : 2013. december 24.
  3. clang: clang: Pragma.cpp Source File (downlink) . clang.llvm.org. Letöltve: 2013. augusztus 19. Az eredetiből archiválva : 2014. április 4.. 
  4. Comeau C++ kiadás előtti felhasználói dokumentáció: Pragmas (downlink) . Comeaucomputing.com. Letöltve: 2013. augusztus 19. Az eredetiből archiválva : 2013. december 11.. 
  5. #pragma egyszer - RAD Studio XE3 . Docwiki.embarcadero.com (2010. december 2.). Letöltve: 2013. augusztus 19. Az eredetiből archiválva : 2013. december 12..
  6. Pragmák . Digitális Mars. Letöltve: 2013. augusztus 19. Az eredetiből archiválva : 2013. december 12..
  7. A csomagolóanyag alternatívái #ifndef . gcc.gnu.org. Letöltve: 2013. augusztus 20. Az eredetiből archiválva : 2016. március 4..
  8. GCC 3.4 Release Series – Változások, új szolgáltatások és javítások . gcc.gnu.org. Letöltve: 2013. augusztus 19. Az eredetiből archiválva : 2010. július 10.
  9. HP aC++/HP ANSI C A.06.26 Kiadási megjegyzések HP Integrity  szerverek . HP támogatási központ. Letöltve: 2016. június 5. Az eredetiből archiválva : 2016. június 23.
  10. Támogatott GCC-pragmák . IBM. Letöltve: 2015. február 20. Az eredetiből archiválva : 2016. március 4..
  11. Diagnosztika 1782: A #pragma egyszer elavult. Használja helyette az #ifndef guardot. . Intel fejlesztői zónák . Letöltve: 2013. december 4. Az eredetiből archiválva : 2013. december 11..
  12. egyszer (C/C++) . msdn.microsoft.com. Letöltve: 2013. augusztus 19. Az eredetiből archiválva : 2016. augusztus 10..
  13. IDE súgó/dokumentáció
  14. ARM információs központ . KAR. Hozzáférés időpontja: 2013. december 17. Az eredetiből archiválva : 2016. október 7.
  15. IAR C/C++ Fejlesztési útmutató (hivatkozás nem érhető el) . IAR rendszerek . Letöltve: 2013. december 4. Az eredetiből archiválva : 2017. május 16. 
  16. Solaris Studio 12.4: C++ felhasználói kézikönyv . Jóslat. Hozzáférés időpontja: 2015. február 20. Az eredetiből archiválva : 2016. október 9.
  17. Solaris Studio 12.4: C Felhasználói kézikönyv . Jóslat. Letöltve: 2015. február 20. Az eredetiből archiválva : 2016. március 4..
  18. Üzenet a normál módosítási beszélgetésből. Az Lcc-win32 egyszer elfogadja és végrehajtja a #pragma-t
  19. Vitaüzenet gondolatok egy régi javaslatról: #egyszer
  20. Elavult egyszeri fejlécek . Letöltve: 2008. június 6. Az eredetiből archiválva : 2007. január 2..
  21. GCC 3.4 Release Series. Változások, új szolgáltatások és javítások . Letöltve: 2008. június 6. Az eredetiből archiválva : 2010. július 10.

További források