2012-05-28 19 views
5

Todos mis archivos de cabecera utilizar incluyen guardias así como pragma una vez:¿"#pragma una vez" tiene el potencial de causar errores?

#pragma once 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

entiendo que pragma una vez no es estándar y puede no ser los mismos compiladores de todo, pero ¿hay alguna posibilidad de que cause y error? ¿Sería mejor probar de alguna manera si está disponible primero?

#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 */ 

quiero proveer pragma una vez como una opción a la posibilidad de acelerar la compilación y evitar nombre-choque, sin dejar de ofrecer compatibilidad a través de compiladores.

+0

Realmente no sé C/C++, pero [este artículo de MSDN] (http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.71%29.aspx) parece sugerir que los ignorados son ignorados. – Ryan

+0

posible duplicado de [¿Es #pragma una vez seguro incluir guardia?] (Http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard) –

+0

Ver también [¿Por qué no es seguro? #pragma de C/C++ una vez un estándar ISO?] (Http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-standard) –

Respuesta

9

Si #pragma once no se admite que simplemente se ignorará [Ref # 1] y guardias de cabecera le servirán el propósito, por lo que nada de malo en el uso de los dos, que realmente no necesita ninguna verificación para el apoyo de #pragma once.

Así que la forma ideal es utilizar ambos #pragma once e incluir guardias y tiene un código portátil que también puede aprovechar la optimización #pragma once que el compilador puede admitir.


[Ref # 1]
estándar de C++ 03: 16.6 directiva Pragma

Una directiva de preprocesamiento de la forma

# pragma pp-tokensopt new-line

hace que el implementación para comportarse de una manera definida por la implementación. Se ignora cualquier pragma que no sea reconocido por la implementación.

5

La norma dice "Cualquier pragma que no sea reconocido por la implementación se ignora.", Por lo que probablemente esté bien, incluso si un compilador no sabe #pragma una vez.

Cuestiones relacionadas