3

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

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

4 回答 4

11

您可以使用__TIME____DATE__宏来获取预处理器运行的时间。这是一个字符串,所以你需要从那里将它转换为一个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。如果翻译日期不可用,则应提供实现定义的有效日期。

asctime很清楚:

...月份的缩写是“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”和“十二月”...

但是说%bstrptime()

%b 或 %B 或 %h

根据当前语言环境的月份名称,缩写形式或全名。

因此,您需要注意,这是对运行时语言环境设置的假设。

(理论上,您可以在constexprC++11 的编译时编写一个或两个函数来执行此操作,但至少可以说这不是微不足道的!)

于 2012-05-04T19:48:24.880 回答
5

__DATE__您可以通过和__TIME__预定义的宏将时间记录为字符串。

如果你想要一个time_t,你必须在运行时转换它。

于 2012-05-04T19:48:01.837 回答
2

它不能完美地解决您的问题,但在 Visual Studio 中,您可以添加后期构建的事件。添加一些控制台命令,例如创建新文件或更新现有文件以查看上次成功构建的时间。我这样做是为了将我的报告文件复制到我需要它们的目录中。我只是构建我的项目,它们都去那里:)

于 2012-05-04T19:48:36.000 回答
0

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

于 2012-05-04T19:51:16.390 回答