记录编译源的时间

时间:2012-05-04 19:45:55

标签: c++ c time compilation

我有一个源文件。当我编译代码时,我希望可执行文件在构建时记住。我想知道是否有可能。例如:

 int main(){
    time_t t = ???  // Time when this line is compiled
    //print out value of t in certain format. 
    return t 
 } 

4 个答案:

答案 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)

在代码中阅读可执行文件的最后修改日期和时间。