Вопрос

У меня есть проблема, которая воспроизводится на g++.VС++ не встречает никаких проблем.Итак, у меня есть 2 файла 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");

Никакой магии, я просто хочу поместить строковые константы в отдельный файл.Во время соединения ld выдает ошибку:"неопределенная ссылка на `_QWERTY'" Первый думал обернуть оба объявления во "внешнюю "С" - не помогло.Ошибка и не C++ _QWERTY все еще существуют.

Спасибо заранее за любые предложения

Это было полезно?

Решение

Похоже, вы, вероятно, столкнулись с этим стандартом:

В C, const-квалифицированный объект в файле область применения без явного хранилища спецификатор класса имеет внешнюю связь. В C++ имеется внутренняя связь.

Внесите это изменение в 2.cpp:

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

В этом вопросе есть более подробная информация о том, что означает «связь» - Что такое внешняя и внутренняя связь в C++?.

Другие советы

Мне пришлось бы это поискать, но я думаю, что глобальные переменные const имеют внутреннюю связь в C++, не используйте const и он скомпилируется нормально.

1.cpp

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

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

Или вы, конечно, можете объявить/определить его как константную строку в общем заголовке.

Добавление лишнего extern в 2.cpp он тоже скомпилируется, но я не уверен, что это стандартно или какое-то «дополнительное» g++

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top