我有一个源文件。当我编译代码时,我希望可执行文件在构建时记住。我想知道是否有可能。例如:
int main(){
time_t t = ??? // Time when this line is compiled
//print out value of t in certain format.
return t
}
答案 0 :(得分:11)
您可以使用__TIME__
和__DATE__
宏来获取time the preprocessor ran at。这是一个字符串,所以你需要convert it to a time_t
。
我放在一起的一个简单例子:
#include <time.h>
#include <iostream>
#include <cassert>
time_t build_time() {
static const char *built = __DATE__" "__TIME__;
struct tm t;
const char *ret = strptime(built, "%b %d %Y %H:%M:%S", &t);
assert(ret);
return mktime(&t);
}
int main() {
std::cout << build_time() << std::endl;
}
我有点担心这与不同的语言环境有什么关系,所以我快速查看了最新的C标准并找到了以下段落:
__DATE__
预处理翻译单元的翻译日期:“Mmm dd yyyy”形式的字符串文字,其中 月份的名称与asctime
生成的月份名称相同 函数,dd的第一个字符是空格字符 值小于10.如果没有翻译日期,则a 应提供实施定义的有效日期。
asctime
非常清楚:
......月份的缩写是 “Jan”,“Feb”,“Mar”,“Apr”,“May”,“Jun”,“Jul”,“Aug”,“Sep”,“Oct”, “十一月”和“十二月”......
%b
的{{1}}说:
%b或%B或%h
根据当前区域设置的月份名称,缩写 表格或全名。
因此,您需要注意这是在运行时设置区域设置的假设。
(理论上你可以在C ++ 11的编译时写一个strptime()
函数来做到这一点,但这至少可以说是非常重要的!)
答案 1 :(得分:5)
您可以通过__DATE__
and __TIME__
predefined macros将时间记录为字符串。
如果你想要time_t
,你必须在运行时转换它。
答案 2 :(得分:2)
它并不能很好地解决您的问题,但在visual studio中您可以添加一个帖子构建的事件。添加一些控制台命令,例如创建新文件或更新现有文件以查看上次成功构建的时间。我这样做是为了将我的报告文件复制到我需要的目录中。我只是构建我的项目,他们都去了那里:)
答案 3 :(得分:0)
在代码中阅读可执行文件的最后修改日期和时间。