我正在尝试为一个项目学习 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;
}
}
(Path::SEGMENT_SEPARATOR 是一个 const char '/')
问题是这样的:对 string::append 的每次调用似乎都没有做任何事情。我用gdb调试了这个函数,parentPath的内容没有改变。我检查了用户输入,在输入中寻找“/0”或其他无效字符(“名称”),但没有发现任何问题。
当我将完全相同的功能移至应用程序项目(从库项目中)时,它确实按预期工作(使用相同的输入)。
两个项目都使用相同的工具集(GCC 4.8.1 并使用 C++11 方言)和相同的编译器参数(所有警告开启,代码中未收到警告)进行编译。我的代码中是否有任何内容可以以这种方式破坏 string::append ?
编辑:该函数是从以下位置调用的:
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 之前初始化,这可能是问题吗?
编辑:我阅读了标准,看来您不能依赖全局变量的任何初始化顺序。这意味着 CONFIG_PATH 和 LOG_PATH 的声明显然是错误的,我应该将它们包装成这样的函数调用:
const IO::Path &getConfigPath(){
static IO::Path config{"conf"};
return config;
};
这可能是字符串附加失败的原因吗?