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:
Si la variable
a
es la misma en ambos archivos, debe declararla comoextern
en todos los archivos excepto uno.extern
palabra claveextern
dice al vinculador que este nombre se encuentra en otros archivos.Puede usar una palabra clave
static
para limitar el alcance de la variable a un archivo. En el que se declara.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 .