Pregunta

Mi conocimiento muy básico de C y el proceso de compilación ha ido oxidado últimamente. Yo estaba tratando de encontrar la respuesta a la siguiente pregunta, pero no pude conectar compilación, enlace y conceptos básicos de la fase de pre-procesamiento. Una búsqueda rápida en Google no ayuda mucho tampoco. Por lo tanto, decidí venir a la fuente última de conocimiento :)

Lo sé: Las variables no deben ser definidos en los archivos .h. Su autorización para declarar allí.

¿Por qué?. Debido a que un archivo de cabecera podría ser incluido desde múltiples lugares, redefiniendo así la variable más de una vez (Enlazador da el error)

Posible solución alternativa:. Use header-guardias en los archivos de cabecera y definir variables en que

¿Es realmente una solución: No, porque header-guardias son para la fase de pre-procesamiento. Esto quiere decir compilador que esta parte ha sido ya incluido y no lo incluya una vez más. Pero nuestro error de definición múltiple viene en la parte enlazador -. Mucho después de la compilación

Todo este asunto me tiene confundido acerca de cómo pre-procesamiento y la vinculación del trabajo. Pensé que preprocesamiento no incluirá el código, si el símbolo protector de cabecera se ha definido. En ese caso, no debe múltiple definición de un problema variable también se resuelven?

¿Qué ocurre que estas directivas de preprocesamiento salvar el proceso de compilación de la redefinición de los símbolos menores de guardias de cabecera, pero el enlazador todavía recibe múltiples definiciones del símbolo?

¿Fue útil?

Solución

guardia de cabecera le protege de múltiples inclusiones en un solo archivo de origen, no desde múltiples archivos de origen. Creo que el problema se deriva de no entender este concepto.

No es que el pre-procesador de guardias están ahorrando durante el tiempo de compilación de este problema. En realidad, durante el tiempo de compilación, un archivo de fuente única se compila en un obj, definiciones de los símbolos no se resuelven. Pero, en el caso de la vinculación cuando el enlazador intenta resolver los definitons símbolo, se confunde al ver más de una definición casuing a la bandera del error.

Otros consejos

Una cosa que he utilizado 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;
...

A continuación, en un archivo .c (generalmente el que contiene el main ()):

#define DEFINE_GLOBALS
#include "var.h"

El resto de los archivos de origen basta con incluir "var.h" normalmente.

Tenga en cuenta que DEFINE_GLOBALS no es un guardia de cabecera, sino que permite declarar / definición de las variables en función de si se ha definido. Esta técnica permite una copia de las declaraciones / definiciones.

Tiene dos archivos .c. Ellos se compilan separado . Cada uno incluye su archivo de cabecera. Una vez. Cada uno tiene una definición. Entran en conflicto en tiempo de enlace.

La solución convencional es:

#ifdef DEFINE_SOMETHING
int something = 0;
#endif

A continuación, #define DEFINE_SOMETHING en único archivo .c.

Los guardias de cabecera dejan un archivo de cabecera está incluido varias veces en la misma unidad de traducción (es decir, en el mismo archivo de origen .c). No tienen ningún efecto si se incluye el archivo en dos o más unidades de traducción.

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