Я пытаюсь изучить C++ для проекта, и у меня проблема с конкатенацией строк. Мое приложение состоит из самого приложения и статически связанного проекта библиотеки. В библиотеке я определил тип, представляющий путь в файловой системе, действуя как обертка вокруг литерала пути std :: string. Я определил функцию для конкатенации пути родительской папки с именем (самим пользователем) самого файла/папки, добавив в разделители путей по мере необходимости. код функции выглядит следующим образом:присоединение к строке не меняет строковое значение
std::string normalize(std::string parentPath, const std::string& name) {
if (name.empty()) {
return parentPath;
} else {
parentPath.reserve(parentPath.length()+name.length()+1);
if (*name.begin() != Path::SEGMENT_SEPARATOR) {
parentPath.append(1,Path::SEGMENT_SEPARATOR);
}
if(*name.rbegin() != Path::SEGMENT_SEPARATOR){
parentPath.append(name);
}else{
parentPath.append(name.begin(), --name.end());
}
return parentPath;
}
}
(Путь :: SEGMENT_SEPARATOR является константной символ «/»)
Проблема заключается в следующем: каждый вызов строки :: Append, кажется, не делать ничего , Я отлаживал функцию с помощью gdb, а содержимое parentPath не менялось. Я проверил вход пользователя, ища «/ 0» или другие недопустимые символы на входе («имя»), но не нашел в этом ничего плохого.
Когда я переместил ту же самую функцию в проект приложения (из проекта библиотеки), она работала так, как ожидалось (с тем же вводом).
Оба проекта скомпилированы с использованием того же набора инструментов (GCC 4.8.1 и используют диалоги C++ 11) и те же параметры компилятора (все предупреждения включены, предупреждения не получены в коде). Есть ли что-нибудь в моем коде, которое могло бы сломать строку :: append таким образом?
EDIT: функция вызывается из:
Path::Path(const Path& parent, const std::string& name) : path_(normalize(parent.path_, name)) { }
Path::Path(const Path& parent, const char* name) : Path(parent, std::string(name)) {}
Который в свою очередь, вызывается из (заголовочный файл):
extern const IO::Path CONFIG_PATH;
extern const IO::Path LANGUAGES_PATH;
С определением в CPP файле:
const IO::Path Game::CONFIG_PATH{"conf"};
const IO::Path Game::LOG_PATH{CONFIG_PATH,"log"};
Проверка объекта LOG_PATH показывает его значение «path_» как «conf» вместо «conf/log», как ожидалось. Могу ли я быть уверен, что CONFIG_PATH инициализируется до LOG_PATH, может это проблема?
EDIT: Я прочитал стандарт и, похоже, вы не можете полагаться на какой-либо порядок инициализации для глобальных переменных. Это означает, что заявления CONFIG_PATH и log_path, очевидно, ошибки, и я, вероятно, следует завернуть их в вызов функции, как это:
const IO::Path &getConfigPath(){
static IO::Path config{"conf"};
return config;
};
Может ли это быть, почему добавляемую строку не удается?
Почему вы не используете '+' для concat строк? И вам не нужно резервировать перед добавлением. – deepmax
Хорошо. Мне действительно интересно. Имеет ли 'push_back()' одна и та же проблема для отдельных символов или вообще ничего не меняет 'parentPath'? – WhozCraig
см. Http://codepad.org/FyZh0ZMh, немного изменился, и он работает нормально – Saksham