Pregunta

Tengo un problema que se reproduce en g ++. VC ++ no encuentra ningún problema. Así que tengo 2 archivos cpp:

1.cpp:

#include <string>
#include <iostream>

extern const std::string QWERTY;

int main()
{
    std::cout << QWERTY.c_str() << std::endl;

}

2.cpp:

#include <string>
const std::string QWERTY("qwerty");

No es mágico, solo quiero colocar constantes de cadena en un archivo separado. En el momento del enlace, ld produce un error: " referencia indefinida a `_QWERTY '" El primero piensa en envolver ambas declaraciones en " extern " C " " - no ayudó Error y no c ++ _QWERTY sigue ahí.

Gracias de antemano por cualquier sugerencia

¿Fue útil?

Solución

Parece que probablemente te encuentras con este bit del estándar:

  

En C, un objeto const-calificado en el archivo   alcance sin un almacenamiento explícito   El especificador de clase tiene un enlace externo.    En C ++, tiene vínculos internos.

Haz este cambio a 2.cpp:

#include <string>
extern const std::string QWERTY("qwerty");

Hay más detalles sobre qué " vinculación " significa en esta pregunta: ¿Qué es el enlace externo y el enlace interno en C ++? .

Otros consejos

Tendría que buscarlo, pero creo que las variables globales const tienen un vínculo interno en C ++, no use const y se compilará bien.

1.cpp

...
extern std::string QWERTY;
...

2.cpp
#include <string>
std::string QWERTY("qwerty");

O podría declararlo / definirlo como una cadena constante en un encabezado común, por supuesto.

Al agregar un extern superfluo a la 2.cpp, también se compilará, pero no estoy seguro de que sea estándar o algún "extra" de g ++

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