c++ compiler-construction pragma include-guards

c++ - ¿Debo seguir usando#include guardias Y#pragma una vez?



compiler-construction include-guards (3)

Como muestra su tabla, es muy raro encontrar un compilador en uso convencional que no admita #pragma once . Mantener una base de código limpia y de bajo costo requiere un esfuerzo constante de refactorización. Tener que actualizar incluye guardias cada vez que cambias el nombre de una clase o mueves algún código, agrega una carga significativa a este esfuerzo.

Así que diría que aparte de algunos casos de esquina de nicho o de sistemas de compilación rotos, #pragma once es en la práctica seguro para confiar. Si te preocupas por la productividad y la calidad del código, utilizar #pragma once solo #pragma once parece ser la opción más obvia.

Las excepciones son si está escribiendo una biblioteca que necesita soportar todos los compiladores bajo el sol o tiene la mala suerte de tener que trabajar con uno de estos raros compiladores que no tiene esta característica.

http://en.wikipedia.org/wiki/Pragma_once
¿Debo seguir usando incluir guardias cuando todos estos compiladores son compatibles con #pragma once ?
Muchas respuestas en desbordamiento de pila dicen que debo usar ambos para compatibilidad, pero no estoy seguro si eso todavía suena cierto. ¿Qué compiladores de hoy no admiten #pragma once ?

No estoy seguro de si el uso de ambos fue solo una recomendación antes de que se adoptara ampliamente, o si todavía hay muy buenas razones para usar ambos métodos.
¿Algún ejemplo de cuando solo usar #pragma once causará problemas?


Depende de cuánto portátil se espera que sea su programa.

Siempre y cuando esté escribiendo un programa que se supone que debe funcionar con compiladores que definitivamente admite #prama once #pragma once , bastará con usar #pragma once . Pero al hacerlo, restringe su programa a un conjunto de compiladores que admiten la característica definida de implementación.

Si necesita que su programa trabaje en todos los compiladores , debe usar #pragma once e incluir ambos.

En caso de que un compilador no admita #pragma once , simplemente lo ignorará [Ref # 1] , en tal caso los resguardos de encabezado le servirán para el propósito, por lo tanto, no tendrá inconveniente en usarlos cuando no esté al tanto de las funciones admitidas por tus compiladores objetivo

Por lo tanto, si desea que su programa sea 100% portátil en compiladores diferentes, la forma ideal es usar solo los protectores incluidos. Como @CharlesBailey correctamente señala ya que el comportamiento de #pragma once se define la implementación, el comportamiento en un compilador desconocido podría tener un efecto perjudicial en su programa.

[Ref # 1]
Norma C ++ 03: 16.6 directiva Pragma

Una directiva de preprocesamiento de la forma

# pragma pp-tokensopt new-line

hace que la implementación se comporte de una manera definida por la implementación. Cualquier pragma que no sea reconocido por la implementación es ignorado.


No es estándar, así que si quieres estar seguro usa los guardias incluidos