奇怪的程序编译时间
前两天外网版本和发布版本对应不上了,导致外网有大量崩溃。由于上传人员的失误,紧急补丁尽然没有pdb,没有pdb文件的话就没法调试dump文件找到问题所在。还好后来找到了以前备份的pdb,勉强找到了问题所在,确定是外网版本问题。问题找到了,一切都好办了,可是奇怪的事情发生了。
内网发布版本运行显示时间和发布时间差一天,程序发布时间是5.11日。可编译时间显示是5.10号,这就不对了。按理说这两个时间该是一样的啊,开始我也在想这个问题。没想明白,周末休息,突然想到我忽略一个问题。这个编译时间怎么来的?发布时间是通过文件修改时间确定的,这个编译时间不是系统自带的功能。看了下代码,发现原来编译时间是写在main函数里的一个c stand 宏。先看看这两个神奇的宏:
Macro: __DATE__
Description:The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for datesgenerated by the library function asctime declared in TIME.H.
Macro: __TIME__
Description:The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss.
原来这两个宏记录的是当前文件编译的时间,注意是当前文件而不是当前工程。这就知道原因了,由于当时打紧急补丁,我修改完程序后,没有rebuild。所以main函数所在文件没有被重新编译过。自然打印出来的时间是此文件最有一次编译的时间。所以和文件修改时间对应不上了。看似很怪异的问题,真相大白后,问题还是很简单的。还有以后发布版本,或者遇到比较奇怪的问题,建议rebuild下,有时很难缠的问题可能就解决了。并不是说我在瞎试,这也是一种解决问题的途径,我们在解决问题时不一定要多高明的办法,把问题解决了就行。
C stand有很多非常有意思并且有用的宏,比如说__FILE__,__LINE__。有兴趣的同学可以看看。最后要说的是在以后思考解决问题的时候,要多从软件整体去思考问题,站在软件整体流程和运作原理上,先总体后局部的思想。前面部分说的是对问题的描述和解决方案,后面纯属我的浅见,希望大家多多指教和交流。