tutorial smart remix programador online español curso c++ c linkage multiple-definition-error one-definition-rule

c++ - remix - smart contracts ethereum



Enlace global variable por defecto de c & c++, declaración múltiple y problema de definición (4)

Por ejemplo:

code1.c / .cpp

int a; // ... and so on

code2.c / .cpp

int a; int main(void) { return 0; }

ir a compilar

$gcc code1.c code2.c # this is fine $ $g++ code1.cpp code2.cpp # this is dead /tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'' /tmp/ccnIOmPC.o:(.bss+0x0): first defined here collect2: ld returned 1 exit status

¿Hay alguna diferencia de vinculación variable global entre C y C ++?


El compilador g ++ es más estricto que el compilador gcc. También depende de la versión de gcc, puede ser una versión más alta de gcc, es decir, 4.X en adelante puede dar el mismo error.

Utilice extern para evitar


Es ilegal en ambos, pero los compiladores de C generalmente implementan una extensión. Ver esta respuesta


Hay tres formas de resolver el problema:

  1. Si la variable a es la misma en ambos archivos, debe declararla como extern en todos los archivos excepto uno. extern palabra clave extern dice al vinculador que este nombre se encuentra en otros archivos.

  2. Puede usar una palabra clave static para limitar el alcance de la variable a un archivo. En el que se declara.

  3. O puedes usar espacio de nombres sin nombre.


No es estrictamente legal. int a; es una definición provisional en C. Se le permiten múltiples definiciones tentativas y, como máximo, una definición no tentativa por unidad de traducción de cada objeto con enlace externo en C, pero solo una definición en todas las unidades de traducción en un programa.

Es una extensión comúnmente implementada para permitir definiciones tentativas en múltiples unidades de traducción en C, siempre y cuando no más de una unidad de traducción contenga una definición no tentativa, pero no es estrictamente estándar.

En C ++ int a; es solo una definición, no hay concepto de tentativo, y aún es ilegal tener múltiples definiciones de un objeto en las unidades de traducción de un programa.

Para el caso C, puede que desee ver esta pregunta .