2010-06-03 11 views

Respuesta

13

Wikipedia tiene todas las respuestas para esto y es bastante fácil de encontrar

From the article

En los lenguajes de programación C y C++, #pragma once es una directiva no estándar pero ampliamente apoyada preprocesador diseñado para haga que el archivo fuente actual se incluya solo una vez en una sola compilación.

Por lo tanto, #pragma once sirve el mismo propósito que #include guardias, pero con varias ventajas, incluyendo: menos código, evitando colisiones de nombres, y mejorar la velocidad de compilación.

Tiene un vistazo más en profundidad a las ventajas y desventajas en el article. Si está realmente interesado, le sugiero que lo lea por completo, no solo la propaganda anterior.

+0

:) gracias, déjame leer el artículo! – bdhar

+0

Gracias Donal, he estado teniendo problemas al usar el botón de cotización de bloque últimamente, así que he estado tratando de evitarlo. No debería ser tan vago y solo hacerlo manualmente ... –

6
  1. rendimiento - por lo general la aplicación #pragma once compila más rápido, ya que es intención es clara
  2. funcionalidad - ambos tienen el mismo propósito - para evitar más de una inserción de un archivo de cabecera. La versión defined tiene, por supuesto, más ancho utiliza también, y si se usa con cuidado permitirá comprobar en otro archivo si se incluyó la antigua (para la compilación condicional por ejemplo)
  3. usabilidad - si la portabilidad no es un problema ir con #pragma once - sin embargo, esta es una extensión no estándar
+2

El día #pragma una vez se convierte en estándar, mi vida será un poco mejor. – Mizipzor

+0

@mizipzor, no quiero apestoso # pragma, ¡quiero MÓDULOS! http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2073.pdf: D –

+1

El día '#pragma una vez' se vuelve innecesario, mi vida será un poco mejor. –

1

Como Dan McG dicho, son casi los mismos. Pero no recomiendo usar #pragma a menos que sea imposible evitar cosas (como la sección #pragma). Simplemente hace que el código sea más no estándar.

Y no hay ningún problema de funcionalidad/rendimiento. Porque esto está en tiempo de compilación. Es podría aumentar el tiempo de compilación, pero no experimenté ninguna diferencia!

4

Si bien pragma una vez es superior en muchos aspectos a las guardias #ifdef, tiene un defecto importante: se basa en las rutas del sistema de archivos: utiliza la suposición básica de que dos rutas diferentes (absolutas) también son dos archivos diferentes. Lamentablemente, esto no siempre es cierto.

Si bien no es muy probable que tenga problemas con esto, es algo a tener en cuenta.

2

En lo que respecta al rendimiento, no lo he medido, pero se ha informado ampliamente de que los compiladores reconocen el idioma #includeguard y no vuelven a abrir/reprocesar los archivos que los utilizan (por lo tanto, los tratan como si hubieran usado #pragma once) .

Aparte de ese beneficio de rendimiento potencial (que probablemente no exista), veo muy poco que #pragma once ofrezca, es algo más conveniente cuando crea un nuevo encabezado, pero las protecciones realmente no son tan onerosas para instalar. Dado que #pragma once no es particularmente convincente y como todavía trato ocasionalmente con un compilador que no lo admite, utilizo guardias.

Si se demostró que #pragma once tuvo un efecto significativo en el rendimiento, ciertamente empezaría a usarlo.

Dicho eso, deseo que C se haya definido para incluir solo encabezados una vez, a menos que se invoque algún mecanismo para indicar que el encabezado debe procesarse cada vez que se incluye. Los tiempos en los que desea ese comportamiento están muy, muy por fuera, por las veces que no lo hace (y todavía encuentro encabezados de vez en cuando que no tienen guardias o #pragma once). Pero no fue definido de esa manera, por lo que incluyen guardias es ...

3

Algunos más antecedentes sobre esto:

1

#pragma once no es estándar.

Si está contento con la posibilidad de cambiar cada uno de sus archivos de encabezado cuando descubre que su aplicación o biblioteca no se compilará cuando intente trasladarlo a una plataforma diferente, probablemente sea una buena opción.

De lo contrario, quédate con #ifndef/#define/#endif. Especialmente si está creando código de biblioteca para que otras personas lo usen.

Cuestiones relacionadas