2012-05-28 16 views
5

Tutti i miei file di intestazione uso includono guardie così come pragma volta:"#pragma una volta" può causare errori?

#pragma once 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

Capisco che pragma volta non è standard e non può essere lo stesso compilatori tutto, ma non v'è alcun possibilità che causerà e errore? Sarebbe meglio testare in qualche modo se è disponibile prima?

#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE 
    #pragma once 
#endif 

#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

voglio fornire pragma volta come opzione per la compilazione possibilmente speed-up e di evitare nome-scontro, pur fornendo la compatibilità tra compilatori.

+0

io non so davvero C/C++, ma [questo articolo di MSDN] (http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.71%29.aspx) sembra suggerire che quelli non riconosciuti siano ignorati. – Ryan

+0

possibile duplicato di [Is #pragma una volta un safe include guard?] (Http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard) –

+0

Vedi anche [Perché non è #pragma di C/C++ una volta uno standard ISO?] (Http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-standard) –

risposta

9

Se #pragma once non è supportato che viene semplicemente ignorato [Ref # 1] e intestazione guardie vi servirà allo scopo, quindi nulla di sbagliato nell'uso di entrambi, non si ha realmente bisogno di alcun controllo per il sostegno di #pragma once.

Quindi il modo ideale è utilizzare sia #pragma once che includere protezioni e si dispone di un codice portatile che può anche sfruttare l'ottimizzazione #pragma once che il compilatore può supportare.


[Ref # 1]
standard C++ 03: 16.6 direttiva Pragma

Una direttiva al preprocessore della forma

# pragma pp-tokensopt new-line

fa sì che il implementazione per comportarsi in modo definito dall'implementazione. Qualsiasi pragma non riconosciuto dall'implementazione viene ignorato.

5

Lo standard dice "Qualsiasi pragma che non viene riconosciuto dall'implementazione viene ignorato.", Quindi probabilmente stai bene, anche se un compilatore non conosce #pragma una volta.

Problemi correlati