一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

1

#error 與#warning

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

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

#error / #warning

形式 :#error / #warningmessage

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

注意 :message可以不需要雙引號(hào)。

參考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:進(jìn)行預(yù)編譯測(cè)試 *Author:(最后一個(gè)bug) **************************************/ intmain(intargc,char*argv[]){ printf("公眾號(hào);最后一個(gè)bug "); return0; }

輸出結(jié)果:

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

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

解釋一下:

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

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

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

2

#undef

#undef標(biāo)識(shí)符用于把前面的宏定義名取消,別看這宏用得不多,作用可大著呢,下面我簡(jiǎn)單舉幾個(gè)例子:

1

局部宏定義

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

參考demo:

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

輸出結(jié)果:

解釋一下:

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

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

2

選擇接口

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

參考demo:

#include #include #include #defineDEV_SPI #include"Drive.h" #undefDEV_SPI /*************************************** *Fuction:進(jìn)行預(yù)編譯測(cè)試 *Author:(最后一個(gè)bug) **************************************/ intmain(intargc,char*argv[]){ char*strbug="thelastbug"; SendData(strbug); ProcessData(strbug); printf("公眾號(hào);最后一個(gè)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

自定義接口

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

參考demo:

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

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

輸出結(jié)果:

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

責(zé)任編輯:lq

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

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

    關(guān)注

    0

    文章

    679

    瀏覽量

    34003

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    DC/DC轉(zhuǎn)換器選型的三個(gè)要點(diǎn)

    在上一篇《DC/DC 轉(zhuǎn)換器電路設(shè)計(jì)與開發(fā) — 類型與工作原理》中,我們介紹了 DC/DC 轉(zhuǎn)換器的類型以及降壓型 DC/DC 轉(zhuǎn)換器和升壓型 DC/DC轉(zhuǎn)換器的工作原理。本文將為大家分享 DC/DC 轉(zhuǎn)換器選型的三個(gè)要點(diǎn),以及電感器選型的計(jì)算方法。
    的頭像 發(fā)表于 06-12 16:44 ?849次閱讀
    DC/DC轉(zhuǎn)換器選型的<b class='flag-5'>三個(gè)</b>要點(diǎn)

    如何檢測(cè)極管的三個(gè)

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

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

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

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

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

    簡(jiǎn)述光刻工藝的三個(gè)主要步驟

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

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

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

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

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

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

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

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

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

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

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

    相交流電源是三個(gè)什么組成

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

    對(duì)稱相電壓的特點(diǎn)是哪三個(gè)方面

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

    簡(jiǎn)述極管的三個(gè)工作區(qū)域

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

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

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

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

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