Pragma once
Tipus | directive (en) i estàndard de facto |
---|---|
Característiques tècniques | |
Plataforma | C standard library |
En els llenguatges de programació C i C++, #pragma once
és una directiva de preprocessador no estàndard però àmpliament compatible, dissenyada per fer que el fitxer font actual només s'inclogui una vegada en una única compilació.[1] Per tant, #pragma once
té el mateix propòsit que incloure guàrdies, però amb diversos avantatges, com ara menys codi, evitar conflictes de noms i, de vegades, millorar la velocitat de compilació.[2] D'altra banda, #pragma once
no està necessàriament disponible a tots els compiladors i la seva implementació és complicada i pot ser que no sempre sigui fiable.[3]
Avantatges
[modifica]L'ús de #pragma once
permet al preprocessador C incloure un fitxer de capçalera quan sigui necessari i ignorar una directiva #include
en cas contrari. Això té l'efecte d'alterar el comportament del mateix preprocessador C i permet als programadors expressar les dependències dels fitxers d'una manera senzilla, obviant la necessitat d'una gestió manual.
L'alternativa més comuna a #pragma once
és utilitzar #define
per establir una macro de protecció #include, el nom de la qual és seleccionat pel programador perquè sigui únic per a aquest fitxer. Per exemple,
#ifndef GRANDPARENT_H
#define GRANDPARENT_H
... contents of grandparent.h
#endif /* !GRANDPARENT_H */
Aquest enfocament garanteix mínimament que el contingut del fitxer d'inclusió no es vegi més d'una vegada. Això és més detallat, requereix una intervenció manual més gran i és propens a errors del programador, ja que no hi ha mecanismes disponibles per al compilador per prevenir l'ús accidental del mateix nom de macro en més d'un fitxer, la qual cosa donaria lloc a només un dels fitxers. estar inclòs. És poc probable que aquests errors no es detectin, però poden complicar la interpretació d'un informe d'error del compilador. Com que el mateix preprocessador és responsable de gestionar #pragma once
, el programador no pot cometre errors que provoquin xocs de noms.[4]
Exemple
[modifica]- Arxiu "grandparent.h"
#pragma once
struct foo { int member; };
- Arxiu "parent.h"
#include "grandparent.h"
- Arxiu "child.c"
#include "grandparent.h" #include "parent.h"
En aquest exemple, la inclusió de grandparent.h
tant parent.h
com child.c
normalment causaria un error de compilació, perquè una estructura amb un nom donat només es pot definir una sola vegada en una compilació determinada. La directiva #pragma once
serveix per evitar-ho ignorant les inclusions posteriors de grandparent.h
.
Referències
[modifica]- ↑ «once» (en anglès). Microsoft Docs, 03-11-2016. [Consulta: 25 juliol 2019].
- ↑ «Games from Within: Even More Experiments with Includes» (en anglès), 25-01-2005. Arxivat de l'original el September 30, 2008. [Consulta: 19 agost 2013].
- ↑ TylerMSFT. «once pragma» (en anglès americà), 03-08-2021. [Consulta: 17 desembre 2023].
- ↑ «#pragma once vs include guards?» (en anglès). [Consulta: 17 desembre 2023].