1. 程式人生 > >KEIL獲取工程編譯時間

KEIL獲取工程編譯時間

可以使用KEIL內建的__DATE__ 和 __TIME__ 巨集來實現這個功能
參考範例:
unsigned char code DataStr[]=__DATE__;
unsigned char code TimeStr[]=__TIME__;
這樣,編譯後TimeStr的字串正好是編譯的當前時刻,相當於
unsigned char code TimeStr[]="09:12:04"
這在某些時候很有用,比如管理產品版本時。


這個在編譯時,編譯器會自動的把計算機系統時間編譯進去,它只是一個巨集,編譯後不會改變的,這樣的好處在於確定編譯時間確認版本好和程式碼發行時間

示例程式碼:

printf("%s_%s_%d_%d\n", __DATE__, __TIME__, sizeof(__DATE__),sizeof(__TIME__));

輸出結果為:

Jan 13 2017_17:24:11_12_9

利用__DATE__獲取當前日期,佔用12個位元組,包括字串結束符
利用__TIME__獲取當前時間,佔用9個位元組,包括字串結束符
兩個都是字串型

一邊情況下,C/C++編譯器會內建幾個巨集,這些巨集定義不僅可以幫助我們完成跨平臺的原始碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的除錯資訊。

ANSI C標準中有幾個標準預定義巨集(也是常用的):
__LINE__:在原始碼中插入當前原始碼行號;
__FILE__:在原始檔中插入當前原始檔名;
__DATE__:在原始檔中插入當前的編譯日期
__TIME__:在原始檔中插入當前編譯時間;
__STDC__:當要求程式嚴格遵循ANSI C標準時該標識被賦值為1;
__cplusplus:當編寫C++程式時該識別符號被定義。

編譯器在進行原始碼編譯的時候,會自動將這些巨集替換為相應內容。
示例:

  1. #include <stdio.h>
  2. #define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
  3.     + (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))  
  4. #define MONTH (__DATE__ [2] == 'n' ? 0 \
  5.     : __DATE__ [2] == 'b' ? 1 \  
  6.     : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \  
  7.     : __DATE__ [2] == 'y'
     ? 4 \  
  8.     : __DATE__ [2] == 'n' ? 5 \  
  9.     : __DATE__ [2] == 'l' ? 6 \  
  10.     : __DATE__ [2] == 'g' ? 7 \  
  11.     : __DATE__ [2] == 'p' ? 8 \  
  12.     : __DATE__ [2] == 't' ? 9 \  
  13.     : __DATE__ [2] == 'v' ? 10 : 11)  
  14. #define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
  15.     + (__DATE__ [5] - '0'))  
  16. #define DATE_AS_INT (((YEAR - 2000) * 12 + MONTH) * 31 + DAY)
  17. void show_version()  
  18. {  
  19.     printf("version:2.1\n");  
  20.     printf("build time:%d-%02d-%02d\n",YEAR, MONTH + 1, DAY);  
  21. }  
  22. /** 
  23. __LINE__ 當前語句所在的行號, 以10進位制整數標註. 
  24. __FILE__ 當前原始檔的檔名, 以字串常量標註. 
  25. __DATE__ 程式被編譯的日期, 以"Mmm dd yyyy"格式的字串標註. 
  26. __TIME__ 程式被編譯的時間, 以"hh:mm:ss"格式的字串標註, 該時間由asctime返回. 
  27.  */
  28. void test_macro()  
  29. {  
  30.     // __DATE__, __TIME__, __FILE__, __LINE__ 為預定義巨集
  31.     printf("Date : %s\n", __DATE__);  
  32.     printf("Time : %s\n", __TIME__);  
  33.     printf("File : %s\n", __FILE__);  
  34.     printf("Line : %d\n", __LINE__);  
  35. #ifdef __cplusplus
  36.     printf("__cplusplus=%d\n", __cplusplus);  
  37. #endif
  38. }  
  39. //https://bytes.com/topic/c/answers/215378-convert-__date__-unsigned-int
  40. //c++轉換__DATE__巨集為友好格式的時間和編譯器預定義的巨集
  41. int main (void)  
  42. {  
  43.     printf ("%d-%02d-%02d = %d\n", YEAR, MONTH + 1, DAY, DATE_AS_INT);  
  44.     show_version();  
  45.     test_macro();  
  46.     return 0;