在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

ANSIC幾種特殊的標(biāo)準(zhǔn)定義 (__FILE__、__LINE__、__STDC__···)

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-20 09:46 ? 次閱讀

Ⅰ寫在前面

為方便大家閱讀,本文內(nèi)容已經(jīng)整理成PDF文件:

http://pan.baidu.com/s/1gfHygyn

對于我們大部分使用單片機(jī)進(jìn)行裸機(jī)開發(fā)的朋友來說,可能很少有人在程序中許多關(guān)鍵的地方打印一些關(guān)鍵信息

有較大系統(tǒng)開發(fā),或復(fù)雜系統(tǒng)開發(fā)經(jīng)驗(yàn)的朋友一般都會在程序中輸出很多調(diào)試信息,如在UCOSfreeRTOSLinux等系統(tǒng)開發(fā)調(diào)試時打印許多關(guān)鍵信息。

1.我們在使用STM32庫開發(fā)時,在stm32fxxx_conf.h文件下會發(fā)現(xiàn)如下這么一條語句:

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

這條語句,對于使用寄存器,開發(fā)簡單且不大程序的朋友而言,可能他覺得用處不大,它可能就覺得很占資源,且耗時。

其實(shí)不然,ST這么設(shè)計(jì)是有他一定的道理的,對于開發(fā)大型、復(fù)雜系統(tǒng)的朋友而言,這條語句其實(shí)用處很大。每次,程序運(yùn)行錯誤之后,它會打印程序代碼指定的位置,方便我們在龐大的程序中很快找到錯誤的位置。

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

這里就需要我們在程序中添加一些關(guān)于版本的信息,我們最基礎(chǔ)的就是Vx.x.x.x等這種信息,但對于大型系統(tǒng)而言,這種信息是不夠的,還需要更多,比如:編譯日期,時間,編譯環(huán)境的版本等。

Ⅱ幾種特殊標(biāo)準(zhǔn)定義

上面說了這么多,就是需要讓大家知道,這些特殊標(biāo)準(zhǔn)定義的用途。上面說的只是簡單的舉例,其實(shí)他們的用途還很廣泛,掌握了基礎(chǔ)之后相信你們都會知道它們更多比較實(shí)用的意義。言歸正傳,下面講述這些基礎(chǔ)的知識。

本文主要講述下面幾個標(biāo)準(zhǔn)定義:

__LINE__:正在編譯文件的行號

__FILE__:正在編譯文件的文件名

__DATE__:編譯時刻的日期字符串 如“Jun 17 2017”

__TIME__:編譯時刻的時間字符串 如”1000“

__STDC__:判斷該文件是不是標(biāo)準(zhǔn)C程序

1.__FILE__編譯文件名稱

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

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

比如下面提供源代碼工程:

char BuildFile[] = __FILE__;

printf("編譯文件路徑:%s\n", BuildFile);

Keil:

編譯文件路徑:App\main.c

IAR:

編譯文件路徑:C:\Users\Administrator\Desktop\STM32F417ZG(IAR)_ANSIC幾種特殊的標(biāo)準(zhǔn)定義\App\main.c

2.__LINE__編譯文件行號

上面說的是編譯的文件名,是一個字符串,而這里說的是行號,是一個整型變量,這是這兩者的區(qū)別,所以在我提供工程中可以看到的源代碼:

char BuildLine = __LINE__;

printf("編譯代碼所在行:%d\n", BuildLine);

可以看不是數(shù)組的字符串,打印信息:

編譯代碼所在行:44

一般情況下,__FILE__是和__LINE__結(jié)合一起使用,用于打印我們代碼信息,方便快速定位代碼位置。

3.__DATE__編譯日期

__DATE__日期,需要注意的是:這個日期是你在編譯時Windows系統(tǒng)的日期,如果對應(yīng)那部分代碼之前編譯好了,后面沒有編譯,這個日期還是之前的日期,而不是后面編譯的日期。因此,如果這里用于定版本,就需要在定版本時對工程進(jìn)行全部重新編譯,它才會更新至你最后編譯的日期。

代碼:

char BuildDate[] = __DATE__;

printf("編譯日期:%s\n", BuildDate);

輸出結(jié)果:

編譯日期:Jun 17 2017

4.__TIME__編譯時間

這個和__DATE__一樣的原理,編譯時的時間,也是一個字符串。

再次提醒:用于定版本:需要重新編譯,這樣才是最后一次編譯時間。

代碼:

char BuildTime[] = __TIME__;

printf("編譯時間:%s\n", BuildTime);

輸出結(jié)果

編譯時間:1115

5.__STDC__標(biāo)準(zhǔn)C代碼

這個標(biāo)準(zhǔn)在我們單片機(jī)及嵌入式編程中運(yùn)用的比較少,當(dāng)要求程序嚴(yán)格遵循ANSIC標(biāo)準(zhǔn)時該標(biāo)識符被賦值為1,主要是判斷我們的程序文件是不是標(biāo)準(zhǔn)C程序。

#ifdef __STDC__

printf("標(biāo)準(zhǔn)C代碼文件\n");

#else

printf("非標(biāo)準(zhǔn)C代碼文件\n");

#endif

Ⅲ源代碼分析與下載

為了方便大家學(xué)習(xí),本文提供的源代碼比較基礎(chǔ)和簡單,也方便理論結(jié)合實(shí)際學(xué)習(xí),僅供參考。

我們在之前新建好的Demo工程上添加了如下部分代碼:

char BuildLine = __LINE__;

char BuildFile[] = __FILE__;

char BuildDate[] = __DATE__;

char BuildTime[] = __TIME__;

printf("編譯文件路徑:%s\n", BuildFile);

printf("編譯代碼所在行:%d\n", BuildLine);

printf("編譯日期:%s\n", BuildDate);

printf("編譯時間:%s\n", BuildTime);

#ifdef __STDC__

printf("標(biāo)準(zhǔn)C代碼文件\n");

#else

printf("非標(biāo)準(zhǔn)C代碼文件\n");

#endif

Keil版本輸出結(jié)果:

編譯文件路徑:App\main.c

編譯代碼所在行:44

編譯日期:Jun 17 2017

編譯時間:1115

標(biāo)準(zhǔn)C代碼文件

IAR版本輸出結(jié)果:

編譯文件路徑:C:\Users\Administrator\Desktop\STM32F417ZG(IAR)_ANSIC幾種特殊的標(biāo)準(zhǔn)定義\App\main.c

編譯代碼所在行:44

編譯日期:Jun 17 2017

編譯時間:1100

標(biāo)準(zhǔn)C代碼文件

源代碼工程(STM32F417ZG_ANSIC幾種特殊的標(biāo)準(zhǔn)定義)下載地址:

http://pan.baidu.com/s/1hskScba

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

    關(guān)注

    6039

    文章

    44579

    瀏覽量

    636436
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5357

    瀏覽量

    120658
  • ANSIC
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    8688
收藏 人收藏

    評論

    相關(guān)推薦

    晶圓中scribe line(劃片線)和saw line(鋸片線)的差異

    關(guān)鍵的概念,它們在晶圓的后段工藝中扮演著重要的角色。為了方便理解,我們可以把晶圓比作一塊大餅,而每一片芯片就像是從大餅上切下來的薄片,劃片線和鋸片線則是切割這些薄片的“指引”和“路徑”。 Scribe Line(劃片線) 定義:劃片線是晶圓表面上的一系列細(xì)長的空白區(qū)域,用
    的頭像 發(fā)表于 01-03 11:33 ?202次閱讀
    晶圓中scribe <b class='flag-5'>line</b>(劃片線)和saw <b class='flag-5'>line</b>(鋸片線)的差異

    室內(nèi)精準(zhǔn)定位的應(yīng)用范圍?室內(nèi)精準(zhǔn)定位的方式有哪些

    什么是室內(nèi)精準(zhǔn)定位?簡單來講就是根據(jù)定位功能,實(shí)現(xiàn)室內(nèi)詳細(xì)的布局,然后利用這一功能去確定到精準(zhǔn)的位置。隨著我國科技水平的發(fā)展迅猛,定位系統(tǒng)也從曾經(jīng)初級的簡單定位發(fā)展到了如今的精準(zhǔn)定位,取得了重大
    的頭像 發(fā)表于 07-11 11:52 ?444次閱讀
    室內(nèi)精<b class='flag-5'>準(zhǔn)定</b>位的應(yīng)用范圍?室內(nèi)精<b class='flag-5'>準(zhǔn)定</b>位的方式有哪些

    室內(nèi)精準(zhǔn)定位是什么?室內(nèi)精準(zhǔn)定位的方式有哪些?

    說到室內(nèi)精準(zhǔn)定位很多人可能會比較陌生,因?yàn)檫@一說法并沒有大范圍推廣,又或者說只是很多相關(guān)行業(yè)的人才知道這樣的說法。但是定位這一問題大家都知道吧?尤其是要到一個地方去,都會進(jìn)行定位導(dǎo)航。那么這一般都是
    的頭像 發(fā)表于 07-09 16:30 ?545次閱讀

    app \"espsoftap\"如何使用自定義數(shù)據(jù)?

    ;esp_prov.py\", line 440, inif not custom_data(obj_transport, obj_security, args.custom_data):File
    發(fā)表于 06-24 07:57

    網(wǎng)絡(luò)跳線的標(biāo)準(zhǔn)有哪幾種

    網(wǎng)絡(luò)跳線的標(biāo)準(zhǔn)主要有以下幾種: 雙絞線標(biāo)準(zhǔn):雙絞線分為屏蔽雙絞線(STP)和非屏蔽雙絞線(UTP)兩種類型。其中,Cat5e是最基本的雙絞線標(biāo)準(zhǔn),而Cat6、Cat6a、Cat7和Ca
    的頭像 發(fā)表于 06-14 10:42 ?1014次閱讀

    stm32h745的特殊引腳如何使用HAL庫重定義

    現(xiàn)在手上有塊stm32h745ii的板子,想把pc13 pc14 pc15三個特殊引腳重定義為普通io口,找了一下HAL庫,好像沒有f4庫里面能直接調(diào)用的接口,有知道的大神麻煩告知一下該如何操作
    發(fā)表于 05-24 08:31

    請問CAN數(shù)據(jù)域的數(shù)據(jù)格式該如何定義?以什么標(biāo)準(zhǔn)定義

    最近需要實(shí)現(xiàn)上位機(jī)與下位機(jī)的CAN通訊,現(xiàn)在雙方苦于不知該如何定義數(shù)據(jù)格式,尤其是傳輸浮點(diǎn)數(shù)據(jù)~~ 起初經(jīng)過討論直接根據(jù)個人主觀意愿定義了雙方的數(shù)據(jù)協(xié)議,,,其后,boss要求采用標(biāo)準(zhǔn)進(jìn)行定義
    發(fā)表于 05-09 07:20

    MC SDK5.0導(dǎo)致電機(jī)運(yùn)行時驅(qū)動管發(fā)熱嚴(yán)重,定時器deadtime設(shè)置為0怎么解決?

    ) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } 我的修改方法是main.c中包含頭文件parameters_conversion.h
    發(fā)表于 04-29 08:43

    如何用cubemx做lin通信?

    ; if (HAL_LIN_Init( huart3, UART_LINBREAKDETECTLENGTH_11B) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } }
    發(fā)表于 04-26 07:44

    STM32H743 UART DMA數(shù)據(jù)發(fā)送報錯的原因?

    = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init( huart4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } void
    發(fā)表于 04-26 06:59

    虛擬串口與STM32通信遇到的疑問求解

    ; if (HAL_RCC_ClockConfig( RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__
    發(fā)表于 04-24 08:29

    主循環(huán)里不斷開啟關(guān)閉ADC的DMA傳輸功能,上電有幾率死機(jī)怎么解決?

    ; if (HAL_ADC_ConfigChannel( hadc1,sConfig) != HAL_OK) _Error_Handler(__FILE__, __LINE__); for(i = 0; i &
    發(fā)表于 04-23 07:20

    STM32F0 ADC多通道單次轉(zhuǎn)換,最后一個通道的EOC不置位是為什么?

    = ADC_OVR_DATA_PRESERVED; if (HAL_ADC_Init( hadc) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfig.Channel
    發(fā)表于 04-16 06:34

    STM32F103VET6使用定時器DMA做比較輸出PWM,輸出波形第一次不正確是怎么回事?

    ) { Error_Handler(__FILE__, __LINE__); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL
    發(fā)表于 03-28 07:27

    請問STM32G071如何通過DWT實(shí)現(xiàn)us精準(zhǔn)定時?

    STM32G071怎樣通過DWT實(shí)現(xiàn)us精準(zhǔn)定時?,各位大佬有實(shí)現(xiàn)的嗎?
    發(fā)表于 03-20 06:59
    主站蜘蛛池模板: 成人性视频网站| 国产成人高清| 色婷婷六月| 色在线网站| 国产精品久久久久久久久 | 8天堂资源在线| 色五丁香| 色综合综合色| 欧美黑人黄色片| 天天做天天爱天天做天天吃中| 午夜影视免费完整高清在线观看网站| 激情综合在线观看| 国产亚洲3p一区二区三区| 第四色激情| 全免费一级午夜毛片| 亚洲性爱城| 女人的逼毛片| 性天堂网| 免费视频淫片aa毛片| 成人精品亚洲| 人人干夜夜操| 成人免费播放视频777777| 激情综合网色播五月| 色综合综合网| 国产一级片免费看| 色中色在线视频| xxxx日本69xxxxx| 亚洲色图 欧美| 免费观看黄色网页| 亚洲国产精品热久久2022| 在线女同免费观看网站| 欧美性色生活片天天看99 | 国产精品15p| 人人爽天天爽夜夜爽曰| 国内精品久久久久影院男同志| 99视频热| 你懂的国产精品| 夜夜夜夜夜夜夜猛噜噜噜噜噜噜| 乱人伦xxxx国语对白| 亚洲一级免费视频| 四虎4hu影库永久地址|