chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

1

#error 與#warning

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

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

#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é)果:

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

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

解釋一下:

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

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

那么經(jīng)常有很多小伙伴編譯出來(lái)的代碼有一大堆warning,總是覺(jué)得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é)果:

解釋一下:

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

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

2

選擇接口

通過(guò)宏來(lái)切換不同的接口供程序使用:

參考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來(lái)進(jìn)行輸出打印,而當(dāng)我們放開(kāi)注釋掉的宏,這樣就又可以使用printf了,還是比較方便的。

責(zé)任編輯:lq

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

    關(guān)注

    30

    文章

    4959

    瀏覽量

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

    關(guān)注

    0

    文章

    692

    瀏覽量

    35038

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    三個(gè)經(jīng)典開(kāi)關(guān)電源實(shí)際問(wèn)題解析

    下面三個(gè)關(guān)于多路輸出電源連續(xù)工作模式的問(wèn)題,測(cè)試一下您的電源設(shè)計(jì)知識(shí)。然后核對(duì)您的答案。
    的頭像 發(fā)表于 01-22 16:08 ?758次閱讀
    <b class='flag-5'>三個(gè)</b>經(jīng)典開(kāi)關(guān)電源實(shí)際問(wèn)題解析

    MDD從工程故障看極管三個(gè)極的設(shè)計(jì)誤區(qū)與失效案例

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

    防漆應(yīng)用失敗?八個(gè)常見(jiàn)問(wèn)題與解決方案一文搞定 | 東莞 鉻銳特實(shí)業(yè)

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

    #define預(yù)編譯的指令

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

    #include預(yù)編譯的指令

    眾所周知#include“xxx.h”的作用是用來(lái)包含頭文件的,作用是能夠調(diào)用頭文件中的各類枚舉/結(jié)構(gòu)體/函數(shù)定義等。那么一個(gè)C文件是如何通過(guò)#include“xxx.h”文件就能編譯到那些定義呢
    發(fā)表于 12-04 07:43

    未來(lái)工業(yè)AI發(fā)展的三個(gè)必然階段

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

    NVMe IP開(kāi)發(fā)速成: 三個(gè)月不是夢(mèng)

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

    半導(dǎo)體制造過(guò)程中的三個(gè)主要階段

    前段工藝(Front-End)、中段工藝(Middle-End)和后段工藝(Back-End)是半導(dǎo)體制造過(guò)程中的三個(gè)主要階段,它們?cè)谥圃爝^(guò)程中扮演著不同的角色。
    的頭像 發(fā)表于 03-28 09:47 ?6777次閱讀
    半導(dǎo)體制造過(guò)程中的<b class='flag-5'>三個(gè)</b>主要階段

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

    可以用萬(wàn)用表來(lái)初步確定極管的好壞及類型 (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次下載

    如何在三個(gè)三個(gè)或更多現(xiàn)場(chǎng)可編程門(mén)陣列* (FPGA) 設(shè)備上同時(shí)運(yùn)行OpenVINO??

    無(wú)法同時(shí)使用三個(gè)FPGA卡在同一模型上進(jìn)行推理
    發(fā)表于 03-06 07:15

    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 ?987次閱讀

    使用DDS生成三個(gè)信號(hào)并在Vivado中實(shí)現(xiàn)低通濾波器

    本文使用 DDS 生成三個(gè)信號(hào),并在 Vivado 中實(shí)現(xiàn)低通濾波器。低通濾波器將濾除相關(guān)信號(hào)。
    的頭像 發(fā)表于 03-01 14:31 ?2701次閱讀
    使用DDS生成<b class='flag-5'>三個(gè)</b>信號(hào)并在Vivado中實(shí)現(xiàn)低通濾波器

    DLPA3000 VRST、VOFFSET、VBIAS三個(gè)電壓可以外接LED燈指示嗎?

    我想分別使用三個(gè)LED燈串聯(lián)1~20K電阻來(lái)表示三個(gè)電壓已經(jīng)有輸出了,但是看到datasheet上有下面的描述,所以是否不能直接驅(qū)動(dòng)?
    發(fā)表于 02-21 06:00

    ADS828的GND引腳有三個(gè),這三個(gè)引腳的接地是哪個(gè)接數(shù)字地,哪個(gè)接模擬地?

    在貴公司的這款A(yù)D轉(zhuǎn)換芯片ADS828的GND引腳有三個(gè)(1、16、26)想咨詢一下這三個(gè)引腳的接地是哪個(gè)接數(shù)字地,哪個(gè)接模擬地,還是不用考慮這方面;還有就是在輸出偏置電壓的時(shí)候,在為2.5V的時(shí)候,是用CM輸出端好,還是用REFT和REFB電阻分壓好?
    發(fā)表于 02-14 08:27