getmodulefilename(null)是windows获取exe路径最直接方式,需检查返回值、缓冲区大小并处理宽字符;linux用readlink("/proc/self/exe"),macos用_nsggetexecutablepath;跨平台需注意路径分隔符、目录提取及/proc不可靠时的argv[0]降级方案。

Windows下用GetModuleFileName获取exe路径
在Windows平台,GetModuleFileName是最直接可靠的方式,传入NULL表示获取当前进程主模块(即exe)的完整路径。它返回的是宽字符或窄字符路径,取决于是否定义UNICODE。
常见错误是忽略返回值检查或缓冲区大小——函数返回实际写入长度,若返回0说明失败,需调用GetLastError()排查;缓冲区至少设为MAX_PATH(260),但更稳妥的做法是用MAX_PATH + 1或动态分配。
- 使用
std::wstring接收宽字符路径(推荐,避免编码问题) - 若需UTF-8字符串,用
WideCharToMultiByte(CP_UTF8, ...)转换 - 注意:该路径包含文件名,如需目录路径,需手动截断最后一级
Linux/macOS用/proc/self/exe读符号链接
Linux下标准做法是读取/proc/self/exe这个符号链接,它指向当前进程的可执行文件。macOS没有/proc,需用_NSGetExecutablePath替代。
容易踩的坑是没处理符号链接解析失败的情况——readlink可能返回-1,且缓冲区不足时返回值等于缓冲区大小但不保证null终止;macOS的_NSGetExecutablePath第一次调用会返回所需缓冲区大小,必须先用0试探再分配内存。
C++ Code Review Master
下载
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- Linux示例:
char path[PATH_MAX]; ssize_t len = readlink("/proc/self/exe", path, sizeof(path)-1);,成功后需手动加
