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++程式時該識別符號被定義。
編譯器在進行原始碼編譯的時候,會自動將這些巨集替換為相應內容。
示例:
- #include <stdio.h>
- #define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
- + (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))
- #define MONTH (__DATE__ [2] == 'n' ? 0 \
- : __DATE__ [2] == 'b' ? 1 \
- : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
-
: __DATE__ [2] == 'y'
- : __DATE__ [2] == 'n' ? 5 \
- : __DATE__ [2] == 'l' ? 6 \
- : __DATE__ [2] == 'g' ? 7 \
- : __DATE__ [2] == 'p' ? 8 \
- : __DATE__ [2] == 't' ? 9 \
- : __DATE__ [2] == 'v' ? 10 : 11)
- #define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
- + (__DATE__ [5] - '0'))
- #define DATE_AS_INT (((YEAR - 2000) * 12 + MONTH) * 31 + DAY)
- void show_version()
- {
- printf("version:2.1\n");
- printf("build time:%d-%02d-%02d\n",YEAR, MONTH + 1, DAY);
- }
- /**
- __LINE__ 當前語句所在的行號, 以10進位制整數標註.
- __FILE__ 當前原始檔的檔名, 以字串常量標註.
- __DATE__ 程式被編譯的日期, 以"Mmm dd yyyy"格式的字串標註.
- __TIME__ 程式被編譯的時間, 以"hh:mm:ss"格式的字串標註, 該時間由asctime返回.
- */
- void test_macro()
- {
- // __DATE__, __TIME__, __FILE__, __LINE__ 為預定義巨集
- printf("Date : %s\n", __DATE__);
- printf("Time : %s\n", __TIME__);
- printf("File : %s\n", __FILE__);
- printf("Line : %d\n", __LINE__);
- #ifdef __cplusplus
- printf("__cplusplus=%d\n", __cplusplus);
- #endif
- }
- //https://bytes.com/topic/c/answers/215378-convert-__date__-unsigned-int
- //c++轉換__DATE__巨集為友好格式的時間和編譯器預定義的巨集
- int main (void)
- {
- printf ("%d-%02d-%02d = %d\n", YEAR, MONTH + 1, DAY, DATE_AS_INT);
- show_version();
- test_macro();
- return 0;
- }