国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    4968

    瀏覽量

    73965
  • 編譯
    +關注

    關注

    0

    文章

    694

    瀏覽量

    35162

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    駿馬奔騰,芯向未來:SiC功率器件的“三個必然”與丙午馬年的產業躍遷

    駿馬奔騰,芯向未來:SiC功率器件的“三個必然”與丙午馬年的產業躍遷 日期: 2026年 丙午馬年 除夕 主題: 傾佳電子楊茜“三個必然”戰略論斷與基本半導體碳化硅技術的產業替代邏輯 關鍵詞
    的頭像 發表于 02-15 10:33 ?42次閱讀
    駿馬奔騰,芯向未來:SiC功率器件的“<b class='flag-5'>三個</b>必然”與丙午馬年的產業躍遷

    altium designer 如何畫短路兩或者三個網絡的封裝?

    如何我畫了一天線,有3引腳,TX1,TX2,GND, 但實際上這三個引腳是連在一起的。我導入pcb后,會報DRC警告,這個該怎么解決?
    發表于 02-12 19:30

    三個經典開關電源實際問題解析

    下面三個關于多路輸出電源連續工作模式的問題,測試一下您的電源設計知識。然后核對您的答案。
    的頭像 發表于 01-22 16:08 ?1886次閱讀
    <b class='flag-5'>三個</b>經典開關電源實際問題解析

    MDD從工程故障看極管三個極的設計誤區與失效案例

    一、為什么極管問題總是“看起來很隨機”?在FAE現場支持中,經常遇到如下問題:-同一電路,有的板子正常,有的異常-高溫下工作不穩定-更換批次后性能漂移這些問題,90%都與三個極的設計與使用方式有關
    的頭像 發表于 01-19 11:48 ?202次閱讀
    MDD從工程故障看<b class='flag-5'>三</b>極管<b class='flag-5'>三個</b>極的設計誤區與失效案例

    束管式光纜最簡單三個步驟

    束管式光纜的安裝或施工可簡化為以下三個核心步驟,確保光纖傳輸性能穩定且操作高效: 第一步:路由規劃與準備 路徑勘察 確定光纜敷設路線,避開強電磁干擾源(如高壓線)、尖銳物體或易受外力破壞的區域(如
    的頭像 發表于 01-07 10:12 ?235次閱讀

    防漆應用失敗?八常見問題與解決方案一文搞定 | 東莞 鉻銳特實業

    東莞防漆|鉻銳特實業官網 | 防漆涂覆失敗怎么辦?本文總結8最常見問題(如起泡、不均勻、發白、附著力差等)及實用解決方案,一文幫您避開
    的頭像 發表于 12-24 00:36 ?366次閱讀
    <b class='flag-5'>三</b>防漆應用失敗?八<b class='flag-5'>個</b><b class='flag-5'>常見</b>問題與解決方案一文搞定 | 東莞 鉻銳特實業

    #define預編譯的指令

    #define預編譯指令 顧名思義,這個指令的含義是“定義”,大家可以把該指令視為一種文本的替換。詳細在下面代碼展示 [list=1] [*]//使用該指令定義了一數 [*]#define
    發表于 12-05 07:29

    #include預編譯的指令

    眾所周知#include“xxx.h”的作用是用來包含頭文件的,作用是能夠調用頭文件中的各類枚舉/結構體/函數定義等。那么一C文件是如何通過#include“xxx.h”文件就能編譯到那些定義呢
    發表于 12-04 07:43

    未來工業AI發展的三個必然階段

    與優化 能力的深層革命。 未來十年,工業AI的發展將經歷三個清晰的階段:? 智能輔助 → 智能決策 → 自主優化 。這次進化,構成了工業從“人控機器”到“機器共智”的核心路徑。 一、第一階段:智能輔助(AI for Assistance) 時間窗口:
    的頭像 發表于 10-27 15:47 ?452次閱讀
    未來工業AI發展的<b class='flag-5'>三個</b>必然階段

    請問K230D的三個相機能同步采樣嗎?

    如題 K230D的三個相機能同步采樣嗎?
    發表于 08-04 06:32

    怎么結合嵌入式,Linux,和FPGA三個方向達到一均衡發展?

    在嵌入式領域,不少人都懷揣著讓嵌入式、Linux 和 FPGA 三個方向實現均衡發展的夢想,然而實踐中卻面臨諸多挑戰。就像備受矚目的全棧工程師稚暉君,他從大學玩單片機起步,憑借將智能算法融入嵌入式而
    的頭像 發表于 06-25 10:08 ?863次閱讀
    怎么結合嵌入式,Linux,和FPGA<b class='flag-5'>三個</b>方向達到一<b class='flag-5'>個</b>均衡發展?

    NVMe IP開發速成: 三個月不是夢

    作為NVMe IP開發者,在構建IP時總是需要不斷修改,然后編譯上板測試,每一次編譯,少則20分鐘,多則兩三個小時,對IP的熱情總是在滿懷期待的希望等待中磨滅,NVMe IP開發工具作為一
    的頭像 發表于 04-14 19:52 ?1266次閱讀
    NVMe IP開發速成: <b class='flag-5'>三個</b>月不是夢

    半導體制造過程中的三個主要階段

    前段工藝(Front-End)、中段工藝(Middle-End)和后段工藝(Back-End)是半導體制造過程中的三個主要階段,它們在制造過程中扮演著不同的角色。
    的頭像 發表于 03-28 09:47 ?7333次閱讀
    半導體制造過程中的<b class='flag-5'>三個</b>主要階段

    如何檢測極管的三個

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

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

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