2010-12-30 12 views
11

Il titolo dice tutto. È stato standardizzato #pragma once per C++ 0x? Non conosco alcun compilatore che non ne preveda un'implementazione, con quasi sempre la stessa semantica e nome.Ha fatto #pragma una volta? Lo rende in C++ 0x?

+1

Vedere questo per un [getcha in '#pragma once'] (http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard/1946730#1946730) – Motti

+0

" Quasi "? Stai bene usandolo in diversi compilatori che non lo trattano in modo identico? Oppure, quali altri nomi conosci? (Non è chiaro a chi si applica il "quasi", o entrambi?) –

risposta

13

Tutte le direttive #pragma fanno sì che l'implementazione si comporti in un modo definito dall'implementazione.

Questo non è cambiato tra C++ 03 e l'ultima bozza C++ 0x (n3225.pdf). Includere le guardie sono l'alternativa portatile.

+1

So che le guardie sono l'alternativa portatile, ma ho pensato che avrebbe potuto essere comunque standardizzata. – Klaim

+0

Si noti che l'ultima bozza è n3225.pdf. –

+1

@Prasoon: Così è. A mia difesa, la "bozza attuale" sulla pagina Web WG21 non è aggiornata. http://www.open-std.org/jtc1/sc22/wg21/ –

6

Il compilatore Sun C++ (Solaris) non lo implementa. E no, non è in bozze di C++ 0x.

+0

+1 per le informazioni. – Klaim

-2

È anche banale implementare utilizzando #ifdef. Qual è il principio guida per la nuova versione? Implementa tutto ciò che potresti desiderare e il lavandino della cucina o semplicemente fornirti gli strumenti minimi per farlo da solo?

+8

Ti manca il punto. Gran parte della standardizzazione consiste nel rendere la pratica comune il minimo disponibile per gli strumenti conformi agli standard. Come '#pragma once' è fornito da molti compilatori e si è dimostrato utile. Una parola chiave equivalente standardizzata sarebbe stata utile. – Klaim

+6

include le guardie che ti obbligano a scegliere i nomi nello spazio dei nomi del preprocessore (unico e globale). che è un dolore concesso, molti progetti hanno bisogno di macro da qualche parte, quindi hanno affrontato il problema della scelta degli identificatori del preprocessore senza causare collisioni comunque. tuttavia è un dolore, e vedo ancora un sacco di codice #ifdef FILENAME_H che vola in giro. che è ARGH. i progetti più sensati usano PROJECTNAME_FILENAME_SOMESUFFIX, che è OK, ma bene ... IMO #pragma una volta è la soluzione migliore. –