veo seguir puedo publicaciones porque poner ponen mis los hashtags guardan funcionan deja cómo arrobar aparecen c multiple-definition-error

c - seguir - porque no veo mis hashtags en instagram



¿Cómo prevenir definiciones múltiples en C? (7)

Soy un novato en C y estaba intentando escribir una aplicación de consola con Code :: Blocks. Aquí está el código (simplificado): main.c:

#include <stdio.h> #include <stdlib.h> #include "test.c" // include not necessary for error in Code::Blocks int main() { //t = test(); // calling of method also not necessary return 0; }

test.c:

void test() {}

Cuando intento construir este programa, da los siguientes errores:

*path*/test.c|1|multiple definition of `_ test''| obj/Debug/main.o:*path*/test.c|1|first defined here|

No hay forma de que sea una prueba de definición múltiple (aunque no sé de dónde proviene el subrayado) y parece muy poco probable que la definición se incluya de alguna manera dos veces. Este es todo el código que hay.

He descartado que este error se deba a algún conflicto de nombres con otras funciones o archivos que se llaman test o test.c. Tenga en cuenta que la definición múltiple y la primera están en la misma línea en el mismo archivo.

¿Alguien sabe qué está causando esto y qué puedo hacer al respecto? ¡Gracias!


El subrayado lo pone el compilador y lo utiliza el vinculador. La ruta básica es:

main.c test.h ---> [compiler] ---> main.o --+ | test.c ---> [compiler] ---> test.o --+--> [linker] ---> main.exe

Por lo tanto, su programa principal debe incluir el archivo de encabezado para el módulo de prueba que debe consistir únicamente en declaraciones, como el prototipo de la función:

void test(void);

Esto le permite al compilador saber que existe cuando se está compilando main.c pero el código real está en test.c, luego test.o.

Es la fase de enlace que une los dos módulos.

Al incluir test.c en main.c, está definiendo la función test () en main.o. Es de suponer que estás vinculando main.o y test.o, que contienen la función test ().


La inclusión del archivo de implementación ( test.c ) hace que se anteponga a main.c y se cumpla allí y luego nuevamente por separado. Por lo tanto, la test función tiene dos definiciones: una en el código de objeto de main.c y una en la de test.c , lo que le da una infracción de ODR. main.c crear un archivo de encabezado que contenga la declaración de test e incluirlo en main.c :

/* test.h */ #ifndef TEST_H #define TEST_H void test(); /* declaration */ #endif /* TEST_H */


No debe incluir otros archivos fuente (* .c) en archivos .c. Creo que desea tener un archivo de encabezado ( .h) con la DECLARACIÓN de la función de prueba, y tener su DEFINICIÓN en un archivo .c separado.

El error es causado por múltiples definiciones de la función de prueba (una en test.c y otra en main.c)


Realmente compilas el código fuente de test.c dos veces:

  • La primera vez al compilar test.c sí mismo,
  • La segunda vez al compilar main.c que incluye toda la fuente test.c

Lo que necesita en su main.c para usar la función test() es una declaración simple, no su definición. Esto se logra al incluir un archivo de cabecera test.h que contiene algo como:

void test(void);

Esto informa al compilador que existe tal función con parámetros de entrada y tipo de retorno. Lo que hace esta función (todo dentro de { y } ) queda en su archivo test.c

En main.c, reemplace #include "test.c" por #include "test.h" .

Un último punto: con sus programas siendo más complejos, se encontrará con situaciones en las que los archivos de encabezado se pueden incluir varias veces. Para evitar esto, las fuentes de encabezado algunas veces están delimitadas por definiciones de macro específicas, como:

#ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED void test(void); #endif


Si está utilizando Visual Studio, también puede hacer "#pragma once" en la parte superior del archivo de encabezado para lograr lo mismo que el ajuste "#ifndef ..." -. Es probable que algunos otros compiladores también lo admitan ... Sin embargo, no hagas esto: D Sigue con el # ifndef-wrapping para lograr la compatibilidad entre compiladores. Solo quería hacerle saber que también podría hacer #pragma una vez, ya que probablemente se encontrará con esta afirmación bastante cuando lea el código de otras personas.

Suerte con ello


Si ha agregado test.c a su proyecto de Code :: Blocks, la definición se verá dos veces, una vez a través del #include y una vez por el vinculador. Necesitas:

  • eliminar el #include "test.c"
  • crea un archivo test.h que contiene la declaración: void test ();
  • incluye el archivo test.h en main.c


Tuve un problema similar y lo resolví de la siguiente manera.

Resuelve de la siguiente manera:

Las declaraciones de prototipo de función y la variable global deben estar en el archivo test.h y no se puede inicializar la variable global en el archivo de encabezado.

Definición de la función y uso de la variable global en el archivo test.c

Si inicializa variables globales en el encabezado, tendrá el siguiente error

definición múltiple de `_ prueba ''| obj / Debug / main.o: path / test.c | 1 | primero definido aquí |

Solo las declaraciones de variables globales en el archivo de encabezado sin inicialización deberían funcionar.

Espero eso ayude

Aclamaciones