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 () {}
// 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.