c++ header include forward-declaration

C/C++ declaración adelante vs. incluir



header include (3)

¿Qué sucede cuando incluye algún archivo y qué está sucediendo cuando reenvía declara alguna función / clase?

Cuando incluye un archivo, el preprocesador "copia y pega" sus contenidos en la fuente de inclusión. Cuando reenvía declara una función / clase, está declarando un tipo incompleto, dejando que el resto de la unidad de traducción sepa que existe una función / clase con ese nombre y que se puede usar dentro del contexto donde se permite una declaración incompleta.

Si dos archivos incluyen el mismo archivo, ¿será exitoso el primero en leer toda la función, el segundo fallará pero aún podrá usar las funciones?

Si el archivo incluido incluye guardias de inclusión adecuadas, la segunda inclusión dentro de la misma unidad de traducción será efectivamente no operativa. Si dos archivos de origen diferentes incluyen ese mismo archivo de encabezado, el contenido completo se incluirá en ambos archivos.

¿Qué sucede cuando reenvío declarar alguna función? ¿Esta función ahora está "guardada" y puedo usarla en cualquier lugar o solo se conoce para el mismo archivo? entonces ¿por qué dos archivos con incluir (a un archivo con guardias) funcionarán?

La función solo se puede usar dentro de la unidad de traducción que contiene la declaración directa. En general, cada archivo de origen (.cpp) es una unidad de traducción diferente, las definiciones de macro (las de los resguardos de encabezado), así como las declaraciones / definiciones son válidas dentro de esa unidad de traducción. Los resguardos de encabezado evitan que el mismo archivo de encabezado se incluya más de una vez dentro de la misma unidad de traducción, para evitar errores de declaración múltiple.

¿Qué sucede cuando incluye algún archivo y qué está sucediendo cuando reenvía declara alguna función / clase? Si dos archivos incluyen el mismo archivo, ¿será exitoso el primero en leer toda la función, el segundo fallará pero aún podrá usar las funciones?

¿Qué sucede cuando reenvío declarar alguna función? ¿Esta función ahora está "guardada" y puedo usarla en cualquier lugar o solo se conoce para el mismo archivo? entonces ¿por qué dos archivos con incluir (a un archivo con guardias) funcionarán?

¿Puedo simplemente incluir todo en la información principal y no me molestaré más?

EDITAR:

¿Y por qué los archivos cpp deberían incluir sus encabezados? ¿Qué pasa si no los incluiré?


¿Qué sucede cuando incluye algún archivo y qué está sucediendo cuando reenvía declara alguna función / clase?

Cuando include un archivo, el preprocesador copia de manera efectiva y pega todo el archivo included en el archivo haciendo la include . Cuando reenvía declara una función / clase, le dice al compilador que existe, pero no necesita el archivo de encabezado completo. Esto es necesario cuando tiene dependencias circulares y, en gran medida, reduce los tiempos de compilación en otros lugares.

Si dos archivos incluyen el mismo archivo, ¿será exitoso el primero en leer toda la función, el segundo fallará pero aún podrá usar las funciones?

Si el mismo archivo se incluye dos veces en una unidad de traducción (archivo .cpp ), ambos "tendrán éxito", pero si el encabezado incluye guardias de cualquier tipo, no se cargará nada la segunda vez, porque el preprocesador ya lo hizo " lo copié en la unidad de traducción, y hacerlo por segunda vez haría duplicados de todo, lo que sería un error. Entonces, todos los archivos involucrados pueden usar todas las funciones en todos los encabezados incluidos hasta ese momento.

¿Qué sucede cuando reenvío declarar alguna función? ¿Esta función ahora está "guardada" y puedo usarla en cualquier lugar o solo se conoce para el mismo archivo? entonces ¿por qué dos archivos con incluir (a un archivo con guardias) funcionarán?

Sí, si reenvía declara una función / clase en un encabezado, puede ser utilizada por cualquier otro archivo que incluya ese encabezado.

¿Puedo simplemente incluir todo en la información principal y no me molestaré más?

Probablemente. Una vez que llegue a ejemplos más complicados, terminará con dependencias circulares, que requieren ciertas cosas para declararse y / o definirse en un orden determinado. Aparte de eso, sí. Puede incluir todo en main y mantenerlo simple. Sin embargo, su código tomará FOREVER para compilar.

¿Y por qué los archivos cpp deberían incluir sus encabezados? ¿Qué pasa si no los incluiré?

Entonces ese archivo .cpp no sabrá que existe algo más fuera de sí mismo. No es muy útil.


Respuesta corta: reenviar una clase / función permite que el compilador no tenga que compilar toda la clase / función a menos que sea necesario.

Respuesta larga: reenviar una clase / función es como declarar una clase / función sin definirla. Promete definirlo más adelante, pero por ahora solo quiere informar al compilador que existe. Por lo general, estas desaceleraciones hacia adelante en los archivos de encabezado. Esto generalmente resulta en tiempos de compilación más rápidos porque en los archivos .cpp que incluyen su encabezado, solo aquellos que realmente necesitan la clase que reenvió e incluyen su archivo de encabezado apropiado necesitan compilar ese código de clase incluido.