¿Cómo evito este error de enlace?

Si he definido una variable global (con inicialización) en el archivo de cabecera, e incluí este archivo en dos archivos e bash comstackr y vincular, el comstackdor da un error de vinculación

encabezados.h:

#ifndef __HEADERS #define __HEADERS int x = 10; #endif 

1.c:

 #include "headers.h" main () { } 

2.c:

 #include "headers.h" fun () {} 

El vinculador se queja porque habrá múltiples definiciones de x una vez que reúna todos los archivos de objetos para crear el ejecutable. Tiene dos archivos fuente diferentes, incluido el mismo archivo de encabezado, y ese archivo de encabezado define una variable x tiene un valor de 10, por lo que termina con dos definiciones de x (una en 1.c y otra en 2.c).

Para evitar los errores del enlazador de definición múltiple, coloque esto en un archivo de encabezado (por ejemplo, globals.h ):

 #ifndef GLOBALS_H #define GLOBALS_H /* * The "extern" keyword means that this variable is accessible everywhere * as long as this declaration is present before it is used. It also means * that the variable x may be defined in another translation unit. */ extern int x; #endif 

Luego ponga esto en un archivo fuente:

 #include "globals.h" int x = 10; 

Este es un caso clásico en el que desea que la variable sea declarada o declarada y definida.

Si lo define en ambos archivos de origen, obtendrá un error de vinculador de doble definición. Una forma de manejar esto es establecer solo __HEADERS para uno de los archivos de origen para que sea la __HEADERS en la que se define la variable.

Todos los demás archivos fuente obtienen la statement solamente.

 >>headers.h #ifndef __HEADERS int x = 10; #else extern int x; #endif >>1.c #define __HEADERS #include "headers.h" int main (void) { return 0; } >>2.c #include "headers" void fun (void) { } 

Por supuesto, es mejor dejar las definiciones fuera de los archivos de cabecera en caso de que accidentalmente defina __HEADERS en dos archivos de origen. Tratar:

 >>headers.h extern int x; >>1.c #include "headers.h" int x = 10; int main (void) { return 0; } >>2.c #include "headers" void fun (void) { } 

#include funciona exactamente igual que si hubiera copiado y pegado el texto del archivo de encabezado.

Considérelo de esa manera y verá que, por lo tanto, ha puesto la línea int x=10 en ambos archivos de origen.

A continuación se muestra una versión fija:

 >>headers.h #ifndef __HEADERS #define__HEADERS extern int x; // extern tells the compiler it will be linked from another file #endif ----------------- >>1.c #include "headers.h" int x = 10; // must have it in ONE file for linking purposes main () { } --------------------- >>2.c #include "headers" fun () {} 
  1. Define __HEADERS en el ifndef.
  2. Ponga declaraciones, no definiciones, en sus encabezados:
 // header extern int x; // implementation int x = 10; 

3. 2.c tiene el mal incluido.

Asi que:

 // headers.h #ifndef __HEADERS #define __HEADERS extern int x; #endif 

// 1.c

 #include "headers.h" int x = 10; main () { } 

// 2.c

 #include "headers.h" fun () {} 

Puedes definir x en cualquier lugar. Solo hazlo en un solo lugar.