让程序自动记录编译时间、文件名、函数名、行号等,以QT为例

27 篇文章 20 订阅

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

 

 

 

 

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值