我有一个源文件。当我编译代码时,我希望可执行文件能够记住它的构建时间。我想知道是否可能。例如:
int main(){
time_t t = ??? // Time when this line is compiled
//print out value of t in certain format.
return t
}
您可以使用__TIME__
and __DATE__
宏来获取预处理器运行的时间 http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html。这是一个字符串,所以你需要将其转换为time_t https://stackoverflow.com/questions/321793/date-time-conversion-string-representation-to-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
非常清楚的是:
...月份的缩写是
“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、
“十一月”和“十二月”...
But %b
of strptime()
says:
%b 或 %B 或 %h
月份名称根据当前语言环境,缩写为
形式或全名。
因此,您需要注意,这是对运行时区域设置的设置进行的假设。
(理论上你可以写一个constexpr
在 C++11 中编译时需要一两个函数来执行此操作,但这至少可以说是很重要的!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)