#Pragma è una volta parte dello standard C ++ 11?

Tradizionalmente, il modo standard e portatile per evitare inclusioni multiple di intestazione in C ++ era / è usare il #ifndef - #define - #endif schema di direttive pre-compilatore chiamato anche schema di macro-guardia (vedere lo snippet di codice sotto).

 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif 

Nella maggior parte delle implementazioni / compilatori (vedi immagine sotto) tuttavia, esiste un’alternativa più “elegante” che ha lo stesso scopo dello schema di macro-guardia chiamato #pragma once . #pragma once ha diversi vantaggi rispetto allo schema di macro-protezione, tra cui meno codice, evitamento di conflitti di nome e, a volte, maggiore velocità di compilazione.

inserisci la descrizione dell'immagine qui

Facendo qualche ricerca, mi sono reso conto che sebbene #pragma once direttiva è supportata da quasi tutti i compilatori conosciuti, c’è una certa chiarezza sul fatto che #pragma once direttiva sia parte dello standard C ++ 11 o meno.

Domande:

  • Qualcuno potrebbe chiarire se #pragma once direttiva fa parte dello standard C ++ 11 o no?
  • Se non fa parte dello standard C ++ 11, ci sono piani per includerlo nelle versioni successive (ad esempio, C ++ 14 o versioni successive)?
  • Sarebbe anche bello se qualcuno potesse approfondire ulteriormente i vantaggi / svantaggi nell’utilizzare una delle due tecniche (ad esempio, macro-guardia contro #pragma once ).

#pragma once non è standard. È un’estensione diffusa (ma non universale) che può essere utilizzata

  • se i tuoi problemi di portabilità sono limitati, e
  • puoi essere sicuro che tutti i tuoi file include sono sempre su un disco locale.

È stato considerato per la standardizzazione, ma rifiutato perché non può essere implementato in modo affidabile. (I problemi si verificano quando i file sono accessibili tramite diversi montaggi remoti.)

È abbastanza facile garantire che non vi siano conflitti di protezione inclusi in un singolo sviluppo. Per le librerie, che possono essere utilizzate da molti sviluppi diversi, la soluzione ovvia è generare un sacco di caratteri casuali per la guardia include quando la si crea. (Un buon editor può essere impostato per fare questo per te ogni volta che apri una nuova intestazione.) Ma anche senza questo, devo ancora incontrare problemi con i conflitti tra le librerie.

La sezione §16.6 dello standard (bozza N3936 ) descrive le direttive #pragma come:

Una direttiva di pre-elaborazione del modulo

 # pragma pp-tokensopt new-line 

fa sì che l’implementazione si comporti in un modo definito dall’implementazione. Il comportamento potrebbe causare errori di traduzione o causare il comportamento del traduttore o del programma risultante in modo non conforms. Qualsiasi pragma non riconosciuto dall’implementazione viene ignorato.

Fondamentalmente #pragma once è un’istanza specifica dell’implementazione di una direttiva #pragma , e no, non è standard. Ancora.

È spesso ampiamente supportato dalla maggior parte dei “principali compilatori” tra cui GCC e Clang ed è quindi a volte consigliato per evitare la clausola di sicurezza di includere-guardie.