0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何得當(dāng)使用C語言的特殊的用法

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2020-09-27 10:41 ? 次閱讀

C語言有很多特殊的用法,如果這些特殊用法使用得當(dāng),會是你的代碼變得更加有健壯,更加容易維護。

比如我們在使用STM32庫的斷言(assert),你會發(fā)現(xiàn)官方提供了包含“__FILE__、__LINE__”的代碼。

標準外設(shè)庫位于stm32fxxx_conf.h文件:

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

HAL使能Assert:

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

如果添加了這段斷言代碼,對于開發(fā)大型、復(fù)雜的系統(tǒng),這條語句其實用處很大。每次程序運行錯誤之后,它會打印程序代碼指定的位置,方便我們在龐大的程序中很快找到錯誤的位置。

我們的系統(tǒng)會隨著時間的推移,不斷升級更新,也就是需要提交很多版本的可執(zhí)行文件(hex、bin等)。但是,產(chǎn)品后期使用中,我們對某些設(shè)備進行了升級,可能忽略了一些設(shè)備(忘記升級),如果出現(xiàn)故障,我們怎樣才能很快找到是哪一個版本的軟件出現(xiàn)故障呢?

我們的系統(tǒng)會隨著時間的推移,不斷升級更新,也就是需要提交很多版本的可執(zhí)行文件(hex、bin等)。但是,產(chǎn)品后期使用中,我們對某些設(shè)備進行了升級,可能忽略了一些設(shè)備(忘記升級),如果出現(xiàn)故障,我們怎樣才能很快找到是哪一個版本的軟件出現(xiàn)故障呢?

C幾種特殊標準定義

__FILE__:正在編譯文件的文件名__LINE__:正在編譯文件的行號__DATE__:編譯時刻的日期字符串 如“Sep 22 2020”__TIME__:編譯時刻的時間字符串 如”1000“__STDC__:判斷該文件是不是標準C程序

1.__FILE__編譯文件名稱

File中文意思即文件,這里的意思主要是指:正在編譯文件對應(yīng)正在編譯文件的路徑和文件的名稱。

Keil版本對應(yīng)的路徑是相對于工程文件而言的路徑,IAR版本路徑是相對Windows路徑。

源代碼:

charBuildFile[]=__FILE__;printf("編譯文件路徑:%s ", BuildFile);

Keil:

編譯文件路徑:Appmain.c

IAR:

編譯文件路徑:C:UsersstrongerHuangDesktop工程主目錄Appmain.c

2.__LINE__編譯文件行號上面說的是編譯的文件名,是一個字符串,而這里說的是行號,是一個整型變量,這是這兩者的區(qū)別, 比如在工程中添加源代碼:

char BuildLine = __LINE__;printf("編譯代碼所在行:%d ", BuildLine); 可以看不是數(shù)組的字符串,打印信息: 編譯代碼所在行:44 一般情況下,__FILE__是和__LINE__結(jié)合一起使用,用于打印我們代碼信息,方便快速定位代碼位置。 3.__DATE__編譯日期__DATE__日期,需要注意的是:這個日期是你在編譯時Windows系統(tǒng)的日期,如果對應(yīng)那部分代碼之前編譯好了,后面沒有編譯,這個日期還是之前的日期,而不是后面編譯的日期。因此,如果這里用于定版本,就需要在定版本時對工程進行全部重新編譯,它才會更新至你最后編譯的日期。 代碼:

char BuildDate[] = __DATE__;printf("編譯日期:%s ", BuildDate); 輸出結(jié)果: 編譯日期:Sep 22 2017 4.__TIME__編譯時間這個和__DATE__一樣的原理,編譯時的時間,也是一個字符串。 再次提醒:用于定版本:需要重新編譯,這樣才是最后一次編譯時間。 代碼:

char BuildTime[] = __TIME__;printf("編譯時間:%s ", BuildTime); 輸出結(jié)果 編譯時間:1000 5.__STDC__標準C代碼這個標準在我們單片機嵌入式編程中運用的比較少,當(dāng)要求程序嚴格遵循ANSIC標準時該標識符被賦值為1,主要是判斷我們的程序文件是不是標準C程序。 代碼:

#ifdef __STDC__ printf("標準C代碼文件 ");#else printf("非標準C代碼文件 ");#endif推薦閱讀:

責(zé)任編輯:xj

原文標題:__FILE__、__LINE__等幾種C標準用法

文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135878
  • File
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    14315
  • Line
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    11584

原文標題:__FILE__、__LINE__等幾種C標準用法

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言與Java語言的對比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨特的優(yōu)勢和特點,適用于不同的應(yīng)用場景。以下將從語法特性、內(nèi)存管理、跨平臺性、性能、應(yīng)用領(lǐng)域等多個方面對C
    的頭像 發(fā)表于 10-29 17:31 ?140次閱讀

    PLC編程語言C語言的區(qū)別

    在工業(yè)自動化和計算機編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯著的區(qū)別。本文將從多個維度深入探討PLC編程
    的頭像 發(fā)表于 06-14 17:11 ?2333次閱讀

    C語言的指針用法

    C語言編程中善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通C指針編程是很有必要的,幫助你成為一名優(yōu)秀的Cer。
    發(fā)表于 03-05 14:22 ?305次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的指針<b class='flag-5'>用法</b>

    plc編程語言c語言的聯(lián)系 c語言和PLC有什么區(qū)別

    PLC編程語言C語言的聯(lián)系 PLC(可編程邏輯控制器)是一種針對自動化控制系統(tǒng)的特殊計算機。PLC編程語言是為了控制和管理自動化生產(chǎn)過程中
    的頭像 發(fā)表于 02-05 14:21 ?3758次閱讀

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點和特點。 C語言
    的頭像 發(fā)表于 02-05 14:11 ?2135次閱讀

    vb語言c++語言的區(qū)別

    VB語言C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設(shè)計和用途上有很多區(qū)別。下面將詳細比較VB
    的頭像 發(fā)表于 02-01 10:20 ?1958次閱讀

    C語言-#和##的具體用法

    C語言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定義的替換的過程中,#號可以作為一個預(yù)處理運算符,把宏參數(shù)轉(zhuǎn)換為字符串。##運算符則可以把兩個宏參數(shù)組合在一起。下面就來說說具體的用法。
    的頭像 發(fā)表于 12-19 12:54 ?4728次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>-#和##的具體<b class='flag-5'>用法</b>

    C語言運行環(huán)境是什么

    C語言運行環(huán)境(C language runtime environment)是指在執(zhí)行C語言程序時所需的軟件及硬件環(huán)境。
    的頭像 發(fā)表于 11-27 16:13 ?3285次閱讀

    如何選擇創(chuàng)建c語言c++

    選擇創(chuàng)建 C 語言C++ 都需要綜合考慮多個因素。在決定使用哪種語言之前,我們需要對這兩種語言的特點、優(yōu)缺點、適用場景、學(xué)習(xí)成本等進行全
    的頭像 發(fā)表于 11-27 15:58 ?559次閱讀

    c語言中a++是什么意思

    C語言中,a++是一個自增運算符,用于對a的值進行自增操作。它是一個簡化的表達式,相當(dāng)于將a的值加1,并返回自增前的值。 C語言中,自增運算符有兩種形式:前自增和后自增。a++屬于后
    的頭像 發(fā)表于 11-26 09:19 ?1.7w次閱讀

    C語言中數(shù)組的用法

    C語言的數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它可以存儲多個相同類型的數(shù)據(jù),例如整數(shù),字符,浮點數(shù)等。數(shù)組的每個元素都有一個索引,用來表示它在數(shù)組中的位置。數(shù)組的索引從0開始,也就是說,數(shù)組的第一個元素的索引是0,第二個元素的索引是1,以此類推。
    的頭像 發(fā)表于 11-24 17:48 ?1211次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中數(shù)組的<b class='flag-5'>用法</b>

    C語言printf函數(shù)族學(xué)習(xí)筆記

    printf 應(yīng)該是學(xué)習(xí)C語言的第一個函數(shù),我們都知道它是用于字符串格式化輸出的。但是它的用法你真正了解了嗎?
    的頭像 發(fā)表于 11-24 11:15 ?888次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>printf函數(shù)族學(xué)習(xí)筆記

    C語言如何創(chuàng)建數(shù)組

    用法和注意事項。 要創(chuàng)建一個數(shù)組,首先需要確定數(shù)組的數(shù)據(jù)類型和大小。C語言中的數(shù)據(jù)類型包括基本數(shù)據(jù)類型(如整數(shù)、浮點數(shù)、字符等)以及派生數(shù)據(jù)類型(如數(shù)組、結(jié)構(gòu)體、枚舉等)。在創(chuàng)建數(shù)組時,需要使用中括號指定數(shù)組的大
    的頭像 發(fā)表于 11-24 10:08 ?1667次閱讀

    c語言在while中嵌套if循環(huán)

    中嵌套if語句的用法和好處。 一、C語言中的while循環(huán)和if語句 在開始我們深入探討while循環(huán)中嵌套if語句的細節(jié)之前,讓我們首先回顧一下while循環(huán)和if語句的基本用法。
    的頭像 發(fā)表于 11-22 10:09 ?5411次閱讀

    C語言for循環(huán)的用法和注意事項

    C 語言是一種廣泛使用的編程語言,它具有簡潔、高效、靈活的特點。C 語言中有很多控制流程的語句,其中 for 循環(huán)是一種常見的循環(huán)結(jié)構(gòu),可以
    的頭像 發(fā)表于 11-20 18:27 ?2202次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>for循環(huán)的<b class='flag-5'>用法</b>和注意事項