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