關注、星標公眾號,不錯過精彩內容

C語言有很多特殊的用法,如果這些特殊用法使用得當,會是你的代碼變得更加有健壯,更加容易維護。
比如我們在使用STM32庫的斷言(assert),你會發現官方提供了包含“__FILE__、__LINE__”的代碼。
標準外設庫位于stm32fxxx_conf.h文件:
HAL使能Assert:

在代碼中會看見如下代碼:

如果添加了這段斷言代碼,對于開發大型、復雜的系統,這條語句其實用處很大。每次程序運行錯誤之后,它會打印程序代碼指定的位置,方便我們在龐大的程序中很快找到錯誤的位置。
我們的系統會隨著時間的推移,不斷升級更新,也就是需要提交很多版本的可執行文件(hex、bin等)。但是,產品后期使用中,我們對某些設備進行了升級,可能忽略了一些設備(忘記升級),如果出現故障,我們怎樣才能很快找到是哪一個版本的軟件出現故障呢?
我們的系統會隨著時間的推移,不斷升級更新,也就是需要提交很多版本的可執行文件(hex、bin等)。但是,產品后期使用中,我們對某些設備進行了升級,可能忽略了一些設備(忘記升級),如果出現故障,我們怎樣才能很快找到是哪一個版本的軟件出現故障呢?
C幾種特殊標準定義
1.__FILE__編譯文件名稱
File中文意思即文件,這里的意思主要是指:正在編譯文件對應正在編譯文件的路徑和文件的名稱。
Keil版本對應的路徑是相對于工程文件而言的路徑,IAR版本路徑是相對Windows路徑。
源代碼:
char BuildFile[] = __FILE__;printf("編譯文件路徑:%s\n", BuildFile);
Keil:
編譯文件路徑:App\main.c
IAR:
編譯文件路徑:C:\Users\strongerHuang\Desktop\工程主目錄\App\main.c
char BuildLine = __LINE__;printf("編譯代碼所在行:%d\n", BuildLine);
char BuildDate[] = __DATE__;printf("編譯日期:%s\n", BuildDate);
char BuildTime[] = __TIME__;printf("編譯時間:%s\n", BuildTime);
#ifdef __STDC__printf("標準C代碼文件\n");#elseprintf("非標準C代碼文件\n");#endif
FreeRTOS V10.4.0更新了哪些功能?
su、sudo、sudo su、sudo -i使用和區別
百度網盤國際版 Dubox 干凈好用,卻與國內用戶無緣

長按前往圖中包含的公眾號關注