女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

"最常見"卻又"最不常用"的三個預編譯

Q4MP_gh_c472c21 ? 來源:最后一個bug ? 作者:bug菌 ? 2020-11-16 15:55 ? 次閱讀

1

#error 與#warning

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

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

#error / #warning

形式 :#error / #warningmessage

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

注意 :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:進行預編譯測試 *Author:(最后一個bug) **************************************/ intmain(intargc,char*argv[]){ printf("公眾號;最后一個bug "); return0; }

輸出結果:

編譯失敗,無法生成可執行文件

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

解釋一下:

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

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

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

2

#undef

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

1

局部宏定義

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

參考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:進行預編譯測試 *Author:(最后一個bug) **************************************/ intmain(intargc,char*argv[]){ printf("configRatio=%d ",configRatio);//報宏未定義 printf("GetSensorVolt=%d ",GetSensorVolt()); printf("GetSensorCurr=%d ",GetSensorCurr()); printf("公眾號;最后一個bug "); return0; }

輸出結果:

解釋一下:

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

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

2

選擇接口

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

參考demo:

#include #include #include #defineDEV_SPI #include"Drive.h" #undefDEV_SPI /*************************************** *Fuction:進行預編譯測試 *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

輸出結果:

3

自定義接口

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

參考demo:

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

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

輸出結果:

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

責任編輯:lq

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

    關注

    30

    文章

    4888

    瀏覽量

    70276
  • 編譯
    +關注

    關注

    0

    文章

    676

    瀏覽量

    33763

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何檢測極管的三個

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

    如何區分場效應管mos管三個引腳

    場效應管mos管三個引腳怎么區分
    發表于 03-07 09:20 ?0次下載

    Linux系統中最重要的三個命令

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

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

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

    可調電阻三個腳怎么接 可調電阻怎么測量好壞

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

    自動發電控制系統具有三個基本功能

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

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

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

    在環境監測系統中一般不常用到的傳感器類型

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

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

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

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

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

    簡述極管的三個工作區域

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

    可調變阻器三個引腳怎么區分

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

    可調電阻三個腳各是什么

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

    如何分別場效應管的三個

    場效應管(Field-Effect Transistor,簡稱FET)是一種半導體器件,廣泛應用于電子電路中。它具有三個主要的引腳:源極(Source)、漏極(Drain)和柵極(Gate)。正確
    的頭像 發表于 07-14 09:14 ?3667次閱讀

    研控8線步進電機最簡單三個步驟

    步進電機是一種將電脈沖信號轉換為機械角位移的電機,廣泛應用于各種自動化設備和機器人中。研控8線步進電機是一種常見的步進電機類型,具有較高的精度和穩定性。本文將詳細介紹研控8線步進電機的三個最簡單
    的頭像 發表于 06-12 09:16 ?2201次閱讀