getcwd需手动管理缓冲区,易因大小不足、未检返回值等出错;filesystem::current_path是C++17推荐替代,自动内存管理、跨平台且支持Unicode,但需编译器支持。
getcwd 是 C 标准库函数,C++ 中仍可调用,但它不返回 std::string,而是写入用户提供的字符缓冲区,必须手动管理大小和内存。常见错误包括:缓冲区太小导致截断、忘记检查返回值、未处理 NULL(失败时返回),以及跨平台路径分隔符差异。
实操建议:
char buf[PATH_MAX](PATH_MAX 在 中定义)if (getcwd(buf, sizeof(buf)) == nullptr) { /* 错误处理 */ }
"C:\\Users\\name",Linux/macOS 返回 "/home/name",注意斜杠方向std::string 要用 std::string(buf),不能直接构造(避免悬空指针)是的。std::filesystem::current_path()(C++17 起)直接返回 std::filesystem::path 对象,自动管理内存、支持 Unicode(在 Windows 上尤其关键)、跨平台行为一致,且可链式操作(如 .string()、.generic_string())。
使用前提:编译器需开启 C++17(如 -std=c++17),链接时可能需额外选项(GCC/Clang 加 -lstdc++fs,MSVC 默认支持)。
实操建议:
std::filesystem::current_path().string()(本地编码)或 .generic_string()(统一用正斜杠)try/catch 中捕获 std::filesystem::filesystem_error
getcwd 语义完全一致——都是进程当前工
两者底层通常都调用系统 API(如 Linux 的 getcwd(2),Windows 的 GetCurrentDirectory),性能差别可忽略。但兼容性上差异明显:
getcwd:C++98 起可用,无依赖;但在嵌入式或 freestanding 环境中可能不可用std::filesystem::current_path:C++17 标准组件,但部分旧编译器(如 GCC 8 以下)实现不完整,Android NDK r21 前默认禁用getcwd 更稳妥;桌面/服务端开发优先选 filesystem
getcwd,并自行封装健壮的字符串包装函数这是最常被混淆的点:std::filesystem::current_path() 和 getcwd() 都返回**进程启动时的工作目录**,不是 main 所在的二进制文件位置。例如你从 /tmp 运行 /usr/bin/myapp,两者都返回 /tmp。
要获取可执行文件路径,需平台特定方法:
/proc/self/exe 符号链接,再用 readlink
_NSGetExecutablePath()()GetModuleFileNameA(nullptr, ...)
std::filesystem::executable_path(),但目前没有标准方案别把 current_path 当成“程序根目录”来用,这个误解会导致配置文件加载失败、资源路径错乱——而且问题在开发机上常因巧合掩盖,上线后才暴露。