是否存在获取编译时间的预处理器宏?__TIMESTAMP__有使用局限
获取编译时刻的预处理器方案
针对你提出的「需要获取编译时刻而非源文件修改时间」的需求,以下是几种可行方案:
1. 直接使用GCC内置的__DATE__和__TIME__宏
这两个是GCC预处理器原生支持的宏,完全满足你的需求:
__DATE__:展开为预处理器处理当前源文件的日期字符串(格式如"Oct 12 2024")__TIME__:展开为预处理器处理当前源文件的时间字符串(格式如"14:35:22")
核心优势:无论源文件是否修改,只要重新执行编译命令,这两个宏都会自动更新为本次编译的时刻,不会像__TIMESTAMP__那样受文件修改时间限制。
示例代码:
#include <stdio.h> int main() { printf("本次编译时刻:%s %s\n", __DATE__, __TIME__); return 0; }
2. 编译时通过外部参数传递统一构建时间
如果需要为整个项目设置统一的构建时间(而非单个文件的编译时间),可以在编译命令中通过-D参数注入系统生成的时间字符串:
# Linux/macOS环境下用date命令生成格式化时间 gcc -DBUILD_TIME="\"$(date '+%Y-%m-%d %H:%M:%S')\"" main.c -o main
代码中直接使用该宏即可:
#include <stdio.h> int main() { printf("项目统一构建时间:%s\n", BUILD_TIME); return 0; }
3. 借助构建工具自动生成时间头文件
对于CMake、Makefile等构建工具,可以自动生成包含构建时间的头文件,确保整个项目的时间一致性:
CMake实现示例
- 创建模板文件
build_time.h.in:
#define PROJECT_BUILD_TIME "@CMAKE_BUILD_DATE@ @CMAKE_BUILD_TIME@"
- 在
CMakeLists.txt中添加配置逻辑:
# 自定义时间格式(UTC时区) string(TIMESTAMP CMAKE_BUILD_DATE "%Y-%m-%d" UTC) string(TIMESTAMP CMAKE_BUILD_TIME "%H:%M:%S" UTC) # 根据模板生成最终头文件 configure_file( ${CMAKE_SOURCE_DIR}/build_time.h.in ${CMAKE_BINARY_DIR}/build_time.h @ONLY ) # 让编译器能找到生成的头文件 include_directories(${CMAKE_BINARY_DIR})
- 代码中引入生成的头文件:
#include <stdio.h> #include "build_time.h" int main() { printf("项目构建时间:%s\n", PROJECT_BUILD_TIME); return 0; }
内容的提问来源于stack exchange,提问作者rimiha
相关产品推荐
相关产品推荐

