Pregunta

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

¿Existe alguna diferencia de vinculación de variables globales entre C y C ++?

¿Fue útil?

Solución

No es estrictamente legal.int a; es una definición provisional en C. Se le permiten múltiples definiciones provisionales y como máximo una definición no provisional 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 provisionales en múltiples unidades de traducción en C siempre que no más de una unidad de traducción contenga una definición no provisional, pero no es estrictamente estándar.

En C ++ int a; es solo una definición, no existe el 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 de C, es posible que desee consultar esta pregunta .

Otros consejos

Es ilegal en ambos, pero los compiladores de C generalmente implementan una extensión.Consulte 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 en uno.La palabra clave extern le dice al enlazador que este nombre se encuentra en otros archivos.

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

  3. O puede utilizar un espacio de nombres sin nombre.

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 superior de gcc, es decir, 4.X en adelante, puede dar el mismo error.

Utilice extern para evitar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top