getfiletime和stat是获取源文件修改时间最可靠方案:windows用getfiletime配合绝对路径和utc时间处理,linux/macos用stat结合realpath解析路径,跨平台需统一用utc避免时区差异,__date__/__time__等宏不可靠。

Windows下用GetFileTime获取源文件修改时间
直接调用系统API最可靠,GetFileTime能拿到精确到100纳秒的最后写入时间。注意它操作的是磁盘上的实际文件,不是编译时的快照——所以必须传入真实路径,不能只靠__FILE__。
-
__FILE__给出的是编译器看到的路径(可能含相对路径、宏展开后路径),需先用GetFullPathNameA转成绝对路径 - 调用
CreateFileA时必须加FILE_SHARE_READ,否则可能因其他进程打开而失败 - 返回的
FILETIME是UTC时间,若要本地时间得过一遍FileTimeToLocalFileTime
示例关键片段:
HANDLE h = CreateFileA(__FILE__, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); FILETIME ft; GetFileTime(h, nullptr, nullptr, &ft); CloseHandle(h);
Linux/macOS用stat获取mtime
stat系统调用是跨Unix系的标准方案,st_mtime字段就是最后修改时间。但__FILE__在Linux下常带相对路径,不处理会找不到文件。
- 用
realpath(__FILE__, nullptr)解析符号链接并转绝对路径,返回指针需free - struct
stat里的st_mtime是time_t类型,直接赋值给std::chrono::system_clock::time_point需转换 - 如果编译时用
-frecord-gcc-switches或CMake设置set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frecord-gcc-switches"),__FILE__可能被预处理器改写,实测某些GCC版本会补全路径,但不可依赖
简单判断是否存在:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
struct stat sb;
if (stat(realpath(__FILE__, nullptr), &sb) == 0) {
auto tp = std::chrono::system_clock::from_time_t(sb.st_mtime);
}
跨平台封装要注意路径和时区
别硬写#ifdef _WIN32分散逻辑,把路径标准化和时间提取拆成独立函数更易维护。核心坑在时区——Windows API默认UTC,POSIX stat返回本地时间(实际取决于tzset),但C++标准库std::chrono::system_clock::from_time_t始终按UTC解释time_t。
- 统一用UTC时间存储和比较,避免跨平台行为差异
- Windows下
FileTimeToSystemTime再转SystemTimeToTzSpecificLocalTime太重,推荐直接用gmtime_s(MSVC)或gmtime_r(glibc)做UTC格式化 - 构建系统里如果用了
add_compile_definitions(FILE_PATH=\"${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp\")这类硬编码,__FILE__就失效了,得换方案
编译期获取不现实,别信__DATE__和__TIME__
__DATE__和__TIME__是预处理器宏,只反映编译触发时刻,跟源文件上次保存时间完全无关。改完代码没重新编译,它们就不变;哪怕文件三天没动,只要执行一次build,它们就刷新。
- 它们字符串格式固定(如
"Jan 01 2024"),没法转成std::chrono::time_point - CI/CD流水线里,编译节点时间和开发者本地时间不同,
__DATE__反而引入不确定性 - 真要编译期嵌入时间戳,得靠CMake生成头文件:
execute_process(COMMAND date "+%Y-%m-%d %H:%M:%S" OUTPUT_VARIABLE BUILD_TIME),再写入build_time.h
文件修改时间本质是运行时I/O操作,任何试图绕过系统调用的“纯编译期方案”都不可靠。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










