Pregunta

¿Hay alguna diferencia entre colocar el #pragma once ¿Dentro de los Guardias incluyen a los exteriores?

caso 1:

#ifndef SOME_HEADER_H
#define SOME_HEADER_H
#pragma once

Caso 2:

#pragma once
#ifndef SOME_HEADER_H
#define SOME_HEADER_H

Me pregunto por la curiosidad si hay algún caso especial en los que prefiera uno u otro (Caso 1 o Caso 2) ya que he decidido combinar tanto (Pragma como Guardias de encabezado) en mi código.

EDITAR:

Creo que ustedes están malinterpretando mi pregunta ... Estoy preguntando sobre la ubicación de pragma once, no Pragma una vez -vs- Guardias de cabeza.

¿Fue útil?

Solución

Hay una diferencia sutil en eso si SOME_HEADER_H ya está definido antes de incluir el encabezado, luego en el segundo caso el preprocesador procesará el #pragma once, y en el primer caso no lo hará.

Verás una diferencia funcional si #undef SOME_HEADER_H e incluya el archivo nuevamente por el mismo TU:

#define SOME_HEADER_H
#include "some_header.h"
#undef SOME_HEADER_H
#include "some_header.h"

Ahora, en el caso 1 tengo todas las definiciones del archivo de encabezado. En el caso 2 no lo hago.

Incluso sin el #undef, posiblemente se podría ver una diferencia en el tiempo de preprocesamiento debido al #pragma once ser ignorado en el caso 1. Eso depende de la implementación.

Puedo pensar en dos formas plausibles que ya podría definirse antes de la primera inclusión de este archivo de encabezado:

  • (el obvio) Un archivo completamente separado lo define, ya sea deliberadamente o por choque de nombre accidental,
  • Una copia de este archivo ya lo ha definido. Dependiendo de la implementación que pueda incluir el caso en el que este archivo se involucre en el mismo TU bajo dos nombres de archivos diferentes, por ejemplo, debido a un enlace simbólico o una fusión del sistema de archivos. Si su implementación admite #pragma once, y examina su documentación con mucho cuidado, es posible que pueda encontrar una declaración definitiva si la optimización se aplica por la ruta bajo la cual se incluye el archivo, o en comparación de algo que identifica el almacenamiento de un archivo, como el número de inodo. Si es este último, incluso puede descubrir si todavía hay estafas que podrían ser tiradas para engañar al preprocesador, como montar a distancia un sistema de archivos local para ocultar que es "el mismo archivo realmente" ...

Sin embargo, utilizado de la manera esperada, no hay diferencia siempre que la implementación trate #pragma once en la forma en que Microsoft lo define. Siempre que se procese en lugar de omitirse, marca el archivo que contiene para la optimización, por lo que no importa si se procesaría o no en un segundo pase a través del archivo, el segundo pase no sucederá.

Y, por supuesto, dado que el Pragma no es estándar, al menos en teoría podría tener un significado completamente diferente en diferentes implementaciones, en cuyo caso podría importar cuándo y cuántas veces se procesa. En la práctica, pensarías que nadie hará eso.

Otros consejos

Son redundantes.

#pragma once no es compatible con todos los compiladores, mientras que los guardias lo son. Solo use los guardias. Los compiladores como GCC son lo suficientemente inteligentes como para comprender incluyen guardias y ni siquiera vuelven a abrir el archivo.

Para responder tu pregunta:

Caso 1:

El compilador verificará si el preprocesador constante está configurado o no, si no lo define y luego verifique la directiva #Pragma Ońce. Es muy probable que sea una búsqueda hash en la cadena "some_header_h" para saber si está definida o no antes de hacer otra búsqueda hash en el nombre del archivo actual (probablemente el archivo __ __ constante establecido por el preprocesador). Entonces, si el archivo nunca se ha leído, tenemos dos búsqueda hash y dos guardados hash, si el archivo se ha leído solo una búsqueda hash.

Caso 2:

Obviamente, esto es lo mismo que el caso 1 pero en orden opuesto. Entonces, lo único que podemos comparar es la longitud de las teclas hash para usar como búsqueda. Dependiendo de la ruta al archivo de encabezado actual, es decir, la longitud de la ruta, la búsqueda hash para el #Pragma una vez que la directiva podría ser más costosa de calcular. Si el nombre del archivo es "c: dude.h", es más corto que "some_header_h".

Así que supongo en resumen. No. No hay un caso especial en el que el caso 1 sea más beneficioso que el caso 2 o viceversa. Al menos no gritar a Heureka;)

Salud

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top