c++oding="utf-8" ?>
最直接方式是调用posix函数getcwd:linux/macos用getcwd(nullptr, 0)并free,windows用_getcwd配合max_path缓冲区;c++17起推荐std::filesystem::current_path(),自动内存管理且类型安全。

用 getcwd 获取当前工作目录(C++ POSIX 风格)
在 Linux/macOS 或 Windows(MSVC/MinGW)下,最直接的方式是调用 POSIX 标准函数 getcwd。它不是 C++ 标准库函数,但被广泛支持,且无需额外依赖。
注意:返回的是 C 风格字符串(char*),需手动分配足够缓冲区,或用 nullptr 让系统分配(此时必须用 free 释放)。
-
getcwd(nullptr, 0)在大多数现代系统上可用,返回动态分配的字符串,失败时返回nullptr - 缓冲区大小不能只写
PATH_MAX—— 它在某些头文件中未定义,或值不可靠;更稳妥的是用2048或4096预分配,或直接用nullptr方式 - 调用后务必检查返回值是否为
nullptr,否则可能崩溃或读到垃圾内存
#include <unistd.h> // Linux/macOS
#include <cstdlib> // free()
#include <iostream><p>int main() {
char* cwd = getcwd(nullptr, 0);
if (cwd) {
std::cout </p>
<h3>Windows 下用 <code>_getcwd</code> 替代(MSVC 环境)</h3>
<p>MSVC 不默认启用 <code>getcwd(nullptr, 0)</code>,推荐用微软扩展的 <code>_getcwd</code>,行为类似但更兼容旧版本。</p>
<p>它和 <code>getcwd</code> 参数一致,只是函数名带下划线前缀;同样需要手动管理缓冲区内存。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2823" title="C++14"><img
src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="overflowclass">C++14</a>
<p class="overflowclass">C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<ul>
<li>头文件是 <code><direct.h></direct.h></code>,不是 <code><unistd.h></unistd.h></code>
</li>
<li>缓冲区长度必须显式传入,不支持 <code>nullptr</code>;建议至少 <code>MAX_PATH</code>(通常为 260)</li>
<li>若路径超长,返回 <code>nullptr</code> 且 <code>errno</code> 设为 <code>ERANGE</code>
</li>
</ul>
<pre class="brush:php;toolbar:false;">#ifdef _WIN32
#include <direct.h>
#include <stdio.h>
char buf[MAX_PATH];
char* cwd = _getcwd(buf, sizeof(buf));
if (!cwd) {
perror("_getcwd");
}
#endif</stdio.h></direct.h>
C++17 起用 std::filesystem::current_path()(跨平台首选)
如果你能使用 C++17 或更高标准,std::filesystem::current_path() 是最干净、安全、可移植的选择。它返回 std::filesystem::path 对象,自动管理内存,异常语义清晰。
注意:编译时需链接 stdc++fs(GCC)或开启 /std:c++17(MSVC),否则链接失败。
- 成功时返回完整路径对象,可直接转
.string()或.u8string() - 失败时抛出
std::filesystem::filesystem_error,不是返回空值 —— 必须 try/catch - 某些嵌入式或精简环境(如部分 WSL1 配置)可能未完全实现该库,首次使用建议验证
#include <filesystem>
#include <iostream><p>try {
auto p = std::filesystem::current_path();
std::cout </p>
<h3>常见误判:把可执行文件路径当成工作目录</h3>
<p>很多人混淆“程序启动时所在目录”和“程序当前工作目录”。前者是可执行文件位置,后者是进程实际的 <code>cwd</code>,可被 shell 的 <code>cd</code>、代码中的 <code>chdir</code> 改变。</p>
<p>比如从 <code>/home/user</code> 运行 <code>/opt/myapp/bin/app</code>,工作目录仍是 <code>/home/user</code>,不是 <code>/opt/myapp/bin</code>。</p>
<ul>
<li>想获取可执行文件路径,得用平台 API:<code>/proc/self/exe</code>(Linux)、<code>_NSGetExecutablePath</code>(macOS)、<code>GetModuleFileName</code>(Windows)</li>
<li>
<code>std::filesystem::current_path()</code> 和 <code>getcwd</code> 返回的永远是当前工作目录,与二进制在哪无关</li>
<li>调试时可用 shell 命令 <code>pwd</code> 或 <code>echo %CD%</code> 对照验证,避免凭直觉假设</li>
</ul>
<p><font color="#666">真正容易被忽略的是错误处理方式:用 <code>getcwd</code> 忘了 <code>free</code>,用 <code>current_path</code> 忘了 <code>try/catch</code>,或者在跨平台项目里混用不同 API 却没做预处理器隔离 —— 这些地方一出错,往往表现为偶发崩溃或路径为空,排查成本远高于写对第一行。 </font></p></iostream></filesystem>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










