otro - Definición de variable en archivos de cabecera
headers en c (4)
Mi conocimiento muy básico de C y el proceso de compilación se ha oxidado últimamente. Estaba tratando de encontrar la respuesta a la siguiente pregunta, pero no pude conectar los aspectos básicos de la fase de compilación, enlace y preprocesamiento. Una búsqueda rápida en el Google tampoco ayudó mucho. Entonces, decidí llegar a la fuente última de conocimiento :)
Lo sé: las variables no deben definirse en los archivos .h. Está bien declararlos allí.
Por qué: debido a que un archivo de encabezado podría incluirse desde varios lugares, redefinir la variable más de una vez (el vinculador da el error).
Posible solución temporal: utilice protectores de encabezado en los archivos de encabezado y defina la variable en eso.
¿Es realmente una solución? No. Porque los protectores de cabecera son para la fase de preprocesamiento. Eso es para decirle al compilador que esta parte ya se ha incluido y no la vuelva a incluir. Pero nuestro error de definición múltiple viene en la parte del enlazador, mucho después de la compilación.
Todo esto me ha confundido acerca de cómo funciona el preprocesamiento y la vinculación. Pensé que el preprocesamiento simplemente no incluirá el código, si se ha definido el símbolo de protección del encabezado. En ese caso, ¿no debería resolverse la definición múltiple de un problema variable?
¿Qué sucede si estas directivas de preprocesamiento guardan el proceso de compilación de la redefinición de símbolos en los guardias de encabezado, pero el vinculador aún tiene varias definiciones del símbolo?
Header Guard lo protege de múltiples inclusiones en un solo archivo de origen, no de múltiples archivos de origen. Supongo que su problema se deriva de no entender este concepto.
No es que los guardias del preprocesador estén guardando durante el tiempo de compilación de este problema. En realidad, durante el tiempo de compilación, un solo archivo de origen se compila en un objeto, las definiciones de los símbolos no se resuelven. Pero, en caso de vinculación cuando el vinculador intenta resolver las definiciones de los símbolos, se confunde al ver más de una definición para marcar el error.
Los protectores de encabezado impiden que un archivo de encabezado se incluya varias veces en la misma unidad de traducción (es decir, en el mismo archivo fuente .c). No tienen ningún efecto si incluye el archivo en dos o más unidades de traducción.
Tienes dos archivos .c Se compilan por separado . Cada uno incluye su archivo de cabecera. Una vez. Cada uno obtiene una definición. Ellos entran en conflicto en el tiempo de enlace.
La solución convencional es:
#ifdef DEFINE_SOMETHING
int something = 0;
#endif
Luego, # define DEFINE_SOMETHING en un solo archivo .c.
Una cosa que he usado en el pasado (cuando las variables globales estaban de moda):
archivo var.h:
...
#ifdef DEFINE_GLOBALS
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int global1;
EXTERN int global2;
...
Luego, en un archivo .c (generalmente el que contiene main ()):
#define DEFINE_GLOBALS
#include "var.h"
El resto de los archivos de origen solo incluyen "var.h" normalmente.
Observe que DEFINE_GLOBALS no es un protector de encabezado, sino que permite declarar / definir las variables dependiendo de si está definido. Esta técnica permite una copia de las declaraciones / definiciones.