99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

"最常見"卻又"最不常用"的三個預(yù)編譯

Q4MP_gh_c472c21 ? 來源:最后一個bug ? 作者:bug菌 ? 2020-11-16 15:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1

#error 與#warning

談到預(yù)編譯大家常用的有#if、#else、#ifdef、#ifndef、#endif等等條件編譯選項。

然而在我們閱讀一些大型的代碼或者庫的時候,一般都會看到有#error和#warning,可能有些小伙伴一掃而過并沒有了解清楚這些預(yù)編譯指令到底該怎么用,寫了很久的代碼估計也重來沒有敲過他們。

#error / #warning

形式 :#error / #warningmessage

作用 :生成一個編譯錯誤事件并停止編譯/發(fā)出警告信息

注意 :message可以不需要雙引號。

參考demo:

#include #include //#defineconfigUART_N5 #ifndefconfigUART_N #errorconfigUART_Nmustdefine //#error"configUARTmustdefine" //#warning"configUARTmustdefine" #endif #ifconfigUART_N>4 #errorconfigUART_Nmustnotbelessthan4 //#error"configUART_Nmustnotbelessthan4" //#warning"configUART_Nmustnotbelessthan4" #endif /*************************************** *Fuction:進行預(yù)編譯測試 *Author:(最后一個bug) **************************************/ intmain(intargc,char*argv[]){ printf("公眾號;最后一個bug "); return0; }

輸出結(jié)果:

編譯失敗,無法生成可執(zhí)行文件

上面是放開宏,且使用warning的情況,無其他錯誤的情況下可以生成可執(zhí)行文件。

解釋一下:

通過上面的測試代碼可以了解到,通過配合條件預(yù)編譯#if等,#error和#warning能夠在編譯過程中分別以錯誤和告警的形式提醒開發(fā)人員注意相關(guān)代碼設(shè)計問題,從而保證代碼正確性。

這樣對于發(fā)布一些龐大的庫代碼時,為了讓開發(fā)人員正確的使用庫,這些提示會幫助他更好的移植代碼。

那么經(jīng)常有很多小伙伴編譯出來的代碼有一大堆warning,總是覺得warning關(guān)系不大,然而warning也是分不同類型的,對于一些未使用的變量倒關(guān)系不大,其他情況還是要認真對待,最好是做到"0 Error,0 warning".

2

#undef

#undef標識符用于把前面的宏定義名取消,別看這宏用得不多,作用可大著呢,下面我簡單舉幾個例子:

1

局部宏定義

一旦定義了宏,那么該文件中往下所有的代碼都可以使用該宏,即使是函數(shù)內(nèi)部,這樣導(dǎo)致宏比較混亂,如下面代碼:

參考demo:

#include #include #defineconfigRatio10 /*************************************** *Fuction:獲得傳感器電壓值 *Author:(最后一個bug) **************************************/ intGetSensorVolt(void) { #defineconfigRatio1 intret=0; ret=configRatio*1024;//比例因子*AD值 returnret; //#undefconfigRatio } /*************************************** *Fuction:獲得傳感器電壓值 *Author:(最后一個bug) **************************************/ intGetSensorCurr(void) { #defineconfigRatio2 intret=0; ret=configRatio*1024;//比例因子*AD值 returnret; //#undefconfigRatio } /*************************************** *Fuction:進行預(yù)編譯測試 *Author:(最后一個bug) **************************************/ intmain(intargc,char*argv[]){ printf("configRatio=%d ",configRatio);//報宏未定義 printf("GetSensorVolt=%d ",GetSensorVolt()); printf("GetSensorCurr=%d ",GetSensorCurr()); printf("公眾號;最后一個bug "); return0; }

輸出結(jié)果:

解釋一下:

假如我們沒有注意到函數(shù)內(nèi)部的同名宏定義,當然告警也沒管,那么在main函數(shù)中使用同名宏定義就可能不是我們期待的最上面的宏定義,造成程序bug。

所以我們可以使用#undef來限制每個宏的作用域,如果每個函數(shù)內(nèi)部都使用了#undef,那么main函數(shù)中再使用會報宏沒有定義,這樣便可以找到問題,當然也可以通過警告了解到。

2

選擇接口

通過宏來切換不同的接口供程序使用:

參考demo:

#include #include #include #defineDEV_SPI #include"Drive.h" #undefDEV_SPI /*************************************** *Fuction:進行預(yù)編譯測試 *Author:(最后一個bug) **************************************/ intmain(intargc,char*argv[]){ char*strbug="thelastbug"; SendData(strbug); ProcessData(strbug); printf("公眾號;最后一個bug "); return0; }

#include #ifdefDEV_UART #defineSendData(s)printf("UARTSend:%s ",s) #defineProcessData(s)printf("UARTProcess:%s ",s) #endif #ifdefDEV_CAN #defineSendData(s)printf("CANSend:%s ",s) #defineProcessData(s)printf("CANProcess:%s ",s) #endif #ifdefDEV_SPI #defineSendData(s)printf("SpiSend:%s ",s) #defineProcessData(s)printf("SpiProcess:%s ",s) #endif

輸出結(jié)果:

3

自定義接口

當多個人維護一套代碼的時候,有些同事喜歡調(diào)用庫函數(shù)接口,而有些同事喜歡調(diào)用自定義接口,為了方便統(tǒng)一使用自定義接口或者庫接口,我們會進行如下操作:

參考demo:

#include #include #include #include"Drive.h" //#undefprintf /*************************************** *Fuction:進行預(yù)編譯測試 *Author:(最后一個bug) **************************************/ intmain(intargc,char*argv[]){ char*strbug="thelastbug"; printf("公眾號;最后一個bug "); return0; }

#ifndef__DRIVE_H__ #define__DRIVE_H__ #defineprintfprintf("pleaseuseKprintf! "); externvoidKprintf(char*str); #endif

輸出結(jié)果:

這樣下面的代碼你就只能夠使用Kprintf來進行輸出打印,而當我們放開注釋掉的宏,這樣就又可以使用printf了,還是比較方便的。

責任編輯:lq

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70744
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    679

    瀏覽量

    33995

原文標題:"最常見"卻又"最不常用"的三個預(yù)編譯

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何檢測極管的三個

    可以用萬用表來初步確定極管的好壞及類型 (NPN 型還是 PNP 型 ),并辨別出e(發(fā)射極)、b(基極)、c(集電極)三個電極。
    發(fā)表于 03-08 16:40

    如何區(qū)分場效應(yīng)管mos管三個引腳

    場效應(yīng)管mos管三個引腳怎么區(qū)分
    發(fā)表于 03-07 09:20 ?0次下載

    Linux系統(tǒng)中最重要的三個命令

    Linux劍客是Linux系統(tǒng)中最重要的三個命令,它們以其強大的功能和廣泛的應(yīng)用場景而聞名。這三個工具的組合使用幾乎可以完美應(yīng)對Shell中的數(shù)據(jù)分析場景,因此被統(tǒng)稱為Linux
    的頭像 發(fā)表于 03-03 10:37 ?433次閱讀

    簡述光刻工藝的三個主要步驟

    “ 光刻作為半導(dǎo)體中的關(guān)鍵工藝,其中包括3大步驟的工藝:涂膠、曝光、顯影。三個步驟有一異常,整個光刻工藝都需要返工處理,因此現(xiàn)場異常的處理顯得尤為關(guān)鍵”
    的頭像 發(fā)表于 10-22 13:52 ?2189次閱讀

    可調(diào)電阻三個腳怎么接 可調(diào)電阻怎么測量好壞

    可調(diào)電阻,也稱為電位器,是一種可以調(diào)節(jié)電阻值的電子元件。它通常有三個引腳:兩固定端和一可動端(或稱為中間抽頭)??烧{(diào)電阻的三個腳的連接方式和測量好壞的方法如下: 可調(diào)電阻
    的頭像 發(fā)表于 10-18 14:45 ?6829次閱讀

    自動發(fā)電控制系統(tǒng)具有三個基本功能

    自動發(fā)電控制系統(tǒng)(AGC)具有三個基本功能,這些功能在電力系統(tǒng)的運行和調(diào)度中發(fā)揮著重要作用。以下是這三個基本功能的詳細解析:
    的頭像 發(fā)表于 10-03 15:05 ?1665次閱讀

    自愈式低壓電容器三個接線柱的正確接法

    接線柱的正確接法,通常適用于相系統(tǒng),具體如下: 一、角形接法(△) : 1、 A、B、C 三個接線柱分別連接到電源的A、B、C相。 2、沒有中性點,每相電壓與線電壓相同。 3、適用于
    的頭像 發(fā)表于 09-23 14:36 ?4392次閱讀
    自愈式低壓電容器<b class='flag-5'>三個</b>接線柱的正確接法

    三個電流怎么判斷NPN還是PNP

    在判斷晶體管是NPN型還是PNP型時,主要依據(jù)是其內(nèi)部半導(dǎo)體材料的排列方式以及電流在晶體管中的流動方向。闡述如何根據(jù)三個電流(通常指的是發(fā)射極電流IE、基極電流IB和集電極電流IC)來判斷NPN和PNP晶體管。
    的頭像 發(fā)表于 09-14 15:44 ?4071次閱讀

    在環(huán)境監(jiān)測系統(tǒng)中一般不常用到的傳感器類型

    和環(huán)境參數(shù)。然而,并非所有傳感器類型都適用于環(huán)境監(jiān)測系統(tǒng),有些傳感器由于其特定的應(yīng)用范圍、成本、技術(shù)限制或其他原因,在環(huán)境監(jiān)測中不常使用。 不常用于環(huán)境監(jiān)測系統(tǒng)的傳感器類型 核輻射傳感器 核輻射傳感器主要用于檢測放
    的頭像 發(fā)表于 09-10 14:39 ?1481次閱讀

    基本理想電路元件的三個特征是什么

    基本理想電路元件是構(gòu)成電路的基本單元,它們具有三個基本特征:電壓-電流關(guān)系、能量轉(zhuǎn)換和電路參數(shù)。以下是對這三個特征的分析: 電壓-電流關(guān)系 理想電路元件的電壓-電流關(guān)系是其最基本的特征之一。這種關(guān)系
    的頭像 發(fā)表于 08-25 09:38 ?2386次閱讀

    相交流電源是三個什么組成

    相交流電源是一種廣泛應(yīng)用于工業(yè)和民用領(lǐng)域的電力系統(tǒng),其主要由三個交流電源組成,每個電源的相位相差120度。這種電源系統(tǒng)具有許多優(yōu)點,如傳輸效率高、功率密度大、穩(wěn)定性好等。 一、相交流電源的組成
    的頭像 發(fā)表于 08-23 15:10 ?2120次閱讀

    對稱相電壓的特點是哪三個方面

    對稱相電壓是電力系統(tǒng)中常見的一種電壓形式,它具有三個相位,每個相位之間的相位差為120度。對稱相電壓在工業(yè)生產(chǎn)和日常生活中有著廣泛的應(yīng)用,如電動機、變壓器、發(fā)電機等。本文將從
    的頭像 發(fā)表于 08-12 18:18 ?3157次閱讀

    簡述極管的三個工作區(qū)域

    極管的三個區(qū)域,通常指的是其在不同工作條件下的狀態(tài)區(qū)域,即截止區(qū)、放大區(qū)和飽和區(qū)。這三個區(qū)域定義了極管在不同電壓和電流條件下的行為特性,對于理解和設(shè)計電子電路至關(guān)重要。
    的頭像 發(fā)表于 07-29 10:50 ?6666次閱讀

    可調(diào)變阻器三個引腳怎么區(qū)分

    可調(diào)變阻器,也稱為電位器或可變電阻器,是一種可以調(diào)節(jié)電阻值的電子元件。它廣泛應(yīng)用于各種電子設(shè)備中,如音頻設(shè)備、電源管理、電機控制等。可調(diào)變阻器有三個引腳,分別是固定端、滑動端和可調(diào)端。這三個引腳
    的頭像 發(fā)表于 07-24 11:12 ?2603次閱讀

    可調(diào)電阻三個腳各是什么

    可調(diào)電阻器,也稱為電位器或可變電阻器,是一種可調(diào)節(jié)電阻值的電子元件。它通常由三個腳(引腳)組成,分別是固定腳、滑動腳和可調(diào)腳。以下是對這三個腳的介紹: 固定腳(Fixed Terminal): 固定
    的頭像 發(fā)表于 07-24 11:06 ?4154次閱讀