应优先读取tmpdir环境变量(linux/macos)或调用gettemppath(windows),fallback至/tmp或系统默认;避免硬编码或使用废弃函数;std::filesystem::temp_directory_path虽跨平台但需验证可写性。

Linux/macOS下直接读取TMPDIR环境变量就足够了
多数Unix-like系统(包括macOS)会设置TMPDIR,且优先级高于/tmp。不读它,反而硬编码/tmp,会导致程序在容器或沙盒环境(如Xcode、Flatpak)里写入失败。
- 用
std::getenv("TMPDIR")获取,返回nullptr时再 fallback 到"/tmp" - 别用
tempnam()或mktemp()——它们不尊重TMPDIR,且tempnam()已被C++23标为废弃 - 注意
std::getenv返回的是C字符串,需转为std::string或std::filesystem::path再拼接文件名
Windows必须调用GetTempPath,不能只看TEMP或TMP
GetTempPath不是简单查环境变量:它会依次检查GetEnvironmentVariable("TMP")、"TEMP",再 fallback 到用户临时目录(如C:\Users\Alice\AppData\Local\Temp),最后才是GetWindowsDirectory+"\Temp"。只读TEMP漏掉前两层逻辑,尤其在企业域环境下容易出错。
- 调用
GetTempPathA或GetTempPathW,传入缓冲区大小(至少MAX_PATH) - 返回值是实际写入长度(含结尾
\0),不是路径长度,别直接当strlen用 - 若返回0或大于缓冲区大小,说明失败或缓冲不足——常见于路径过长或权限被策略限制
跨平台封装时,std::filesystem::temp_directory_path最省心但有坑
C++17的std::filesystem::temp_directory_path()底层其实已经做了平台适配:Linux/macOS走TMPDIR,Windows走GetTempPath。但它不是“零成本”——首次调用会触发一次系统调用+环境变量读取,后续缓存结果。
- 它不保证返回路径存在或可写,调用后最好用
std::filesystem::is_writable()验证 - 某些旧版libstdc++(GCC std::filesystem::filesystem_error,需
try/catch - 若项目需支持C++14或更低,别强行用这个,老老实实自己写分支逻辑
路径拼接必须用std::filesystem::path操作符,别手拼/或\
手动拼接temp_dir + "/myapp/" + filename在Windows上会产出C:\Temp/myapp/file——斜杠虽能被API接受,但和系统原生风格不一致,某些安全软件或调试器会报路径可疑。
立即学习“C++免费学习笔记(深入)”;
- 统一用
std::filesystem::path构造,然后用/操作符拼接:temp_dir / "myapp" / filename - 不要用
std::string::operator+拼路径,它不会自动处理分隔符或规范化(如../) - 最终要传给
fopen或std::ofstream时,用.string()或.u8string()(C++20起)转出,别直接c_str()










