我有一个源文件。当我编译代码时,我希望可执行文件记住它的构建时间。我想知道这是否可能。例如:
int main(){
time_t t = ??? // Time when this line is compiled
//print out value of t in certain format.
return t
}
我有一个源文件。当我编译代码时,我希望可执行文件记住它的构建时间。我想知道这是否可能。例如:
int main(){
time_t t = ??? // Time when this line is compiled
//print out value of t in certain format.
return t
}
您可以使用__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
很清楚:
...月份的缩写是“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”和“十二月”...
但是说%b
:strptime()
%b 或 %B 或 %h
根据当前语言环境的月份名称,缩写形式或全名。
因此,您需要注意,这是对运行时语言环境设置的假设。
(理论上,您可以在constexpr
C++11 的编译时编写一个或两个函数来执行此操作,但至少可以说这不是微不足道的!)
__DATE__
您可以通过和__TIME__
预定义的宏将时间记录为字符串。
如果你想要一个time_t
,你必须在运行时转换它。
它不能完美地解决您的问题,但在 Visual Studio 中,您可以添加后期构建的事件。添加一些控制台命令,例如创建新文件或更新现有文件以查看上次成功构建的时间。我这样做是为了将我的报告文件复制到我需要它们的目录中。我只是构建我的项目,它们都去那里:)
在代码中读取可执行文件的最后修改日期和时间属性。