Vés al contingut

Pragma once

De la Viquipèdia, l'enciclopèdia lliure
Pragma once

Tipusdirective (en) Tradueix i estàndard de facto Modifica el valor a Wikidata
Característiques tècniques
PlataformaC 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]
  1. «once» (en anglès). Microsoft Docs, 03-11-2016. [Consulta: 25 juliol 2019].
  2. «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].
  3. TylerMSFT. «once pragma» (en anglès americà), 03-08-2021. [Consulta: 17 desembre 2023].
  4. «#pragma once vs include guards?» (en anglès). [Consulta: 17 desembre 2023].