讓程序自動記錄編譯時間、文件名、函數名、行號等,以QT爲例

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

 

 

 

 

 

 

發佈了124 篇原創文章 · 獲贊 214 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章