C/C++/ASM等源代码文件被编译时,可以通过C/C++编译器的内置宏定义,把编译时间记录下来,
常用的宏有这么几个:
__FILE__ 包含当前程序文件名的字符串
__LINE__ 表示当前行号的整数
__DATE__ 包含当前日期的字符串 ,
__STDC__ 如果编译器遵循ANSI C标准,它就是个非零值
__TIME__ 包含当前时间的字符串
__FUNCTION__ 函数名
int main()
{
printf("%s\n",__FILE__);//打印结果: "test.c"
printf("%d\n",__LINE__);//打印结果: "10"
printf("%s\n",__DATE__);//打印结果: "Nov 09 2019"
printf("%s\n",__TIME__);//打印结果: 12:56:30
printf("%s\n",__FUNCTION__);//打印结果: "main"
}
其中__DATE__和__TIME__这两个宏代表的是该源代码被编译时的日期和时间。
有了这两个宏,我们就能在固件或者exe中记录编译时间了,不过稍微有点不爽的是,日期是英文格式,例如上面例子中,2019年10月9日被写成了Nov 09 2019,这不太符合中国人的习惯。
QT提供了语言相关的类QLocale,可以很方便的把日期由英文字符串转成中文字符串,示例代码如下:
QLocale locale = QLocale::Chinese;
QDateTime time = QDateTime::currentDateTime();
time.fromString(QString("%1 %2").arg(__DATE__).arg(__TIME__), "MMM dd yyyy hh:mm:ss");
this->setWindowTitle(QString("发布时间:") + locale.toString(time, "yyyy/MM/dd ddd HH:mm:ss"));
原理是这样的,首先通过QDataTime::fromString把字符串"Nov 09 2019 12:05:45“转成日期类QDataTime的对象,然后就能把QDataTime利用QLocale转成中文字符串。然后把这个时间字符串设置到了软件的标题栏,效果如下:
有一点需要注意,在IDE中编译程序时,一旦源代码被编译过,当某个源文件没有发生修改时,编译器是不会重新编译它的,这样的后果是:假如某个源文件a.cpp在中午12点被编译过,下午一直在编写其他的源文件,那么a.cpp中的__TIME__宏就一直是中午12点。
解决方法也很简单,每次编译之后,我们都立即把a.cpp编译出的中间文件给删掉,这样就能保证下次编译时,一定会重新编译a.cpp。
会makefile的朋友实现上述功能很简单。其实失市面上的大多数IDE都有编译前处理、后处理的功能,例如QT的编译后处理在这里:
如上图所示,在make步骤的后面添加一个自定义步骤,这个步骤的作用是,删掉编译出的中间文件。删除文件我是写了一个批处理del_mainwondow.obj.bat,如下:
del mainwindow.obj /s