2010-05-24 37 views
23

He agregado algo de carácter const en mi archivo como debajo. El error que recibo es el símbolo duplicado _xyz (decir). ¿Cuál es el problema y cómo podría salir de esto?error de símbolo duplicado C++

const char* xyz = "xyz"; 
class Abc 
{ 
public: 
    Abc() 
    { 
    } 
}; 

Respuesta

37

Si esto es en un fichero de cabecera, que está definiendo xyz cada vez que se #include.

Puede cambiar la declaración como @R Samuel Klatchko muestra. La forma habitual (si los datos no son const) es la siguiente:

En Abc.h:

extern char *xyz; 

En Abc.cpp:

char *xyz = "xyz"; 

Editado para agregar

Tenga en cuenta que los protectores de encabezado no resuelven este problema:

#ifndef XYZ_H 
#define XYZ_H 
... 
#endif 

Los protectores de encabezado evitan los errores de "redefinición", donde el mismo símbolo aparece dos veces en la misma unidad de compilación. Es un error del compilador .

Pero incluso con cabecera guarda la definición de xyz seguirá apareciendo en cada archivo de origen que lo incluye, causando un error de "símbolo duplicado", que es un error de enlazador.

Habría sido más útil si el cartel original lo hubiera mencionado, por supuesto.

+0

declarar una variable en múltiples ocasiones no es un error (si no es dentro de la misma unidad de traducción). Definirlo es –

+0

Debería haber atrapado eso, gracias. – egrunin

+1

Gracias por la aclaración del protector de la cabecera. Sin embargo, aquí hay algo extraño: solo obtengo el error del enlazador para los símbolos duplicados si tengo una función definida en ese encabezado. En mi caso actual, tengo un montón de constantes y un par de funciones definidas en un espacio de nombres dentro de un encabezado. Solo recibo un error de enlazador para las funciones, las de const son correctas. ¿Porqué es eso? –

-9

Proporcione una descripción significativa del problema. ¿Cuál es "mi archivo"? ¿Qué "personaje const" estás tomando?

Por lo que proporcionó hasta ahora, solo puedo adivinar que agregó la definición anterior de xyz a un archivo de encabezado y luego lo incluyó en varias unidades de traducción. El resultado: el objeto xyz se definió más de una vez. De ahí el error.

7

El problema es que cada archivo fuente que incluye su archivo de encabezado obtiene su propia copia de xyz con enlace externo.

La manera más fácil de arreglar eso es dar el enlace interno xyz. Usted puede hacer que al hacer el propio puntero const además de tener const del carbón subyacente:

const char* const xyz = "xyz"; 
+0

+1 Obviusly es la mejor solución. 'const' siempre es bueno. –

+3

const es definitivamente bueno, pero esto oculta el problema de que ahora hay una instancia de los mismos datos en cada archivo. –

Cuestiones relacionadas