1
#error 與#warning
談到預(yù)編譯大家常用的有#if、#else、#ifdef、#ifndef、#endif等等條件編譯選項。
然而在我們閱讀一些大型的代碼或者庫的時候,一般都會看到有#error和#warning,可能有些小伙伴一掃而過并沒有了解清楚這些預(yù)編譯指令到底該怎么用,寫了很久的代碼估計也重來沒有敲過他們。
#error / #warning
形式 :#error / #warningmessage
作用 :生成一個編譯錯誤事件并停止編譯/發(fā)出警告信息
注意 :message可以不需要雙引號。
參考demo:
#include
輸出結(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
輸出結(jié)果:
解釋一下:
假如我們沒有注意到函數(shù)內(nèi)部的同名宏定義,當然告警也沒管,那么在main函數(shù)中使用同名宏定義就可能不是我們期待的最上面的宏定義,造成程序bug。
所以我們可以使用#undef來限制每個宏的作用域,如果每個函數(shù)內(nèi)部都使用了#undef,那么main函數(shù)中再使用會報宏沒有定義,這樣便可以找到問題,當然也可以通過警告了解到。
2
選擇接口
通過宏來切換不同的接口供程序使用:
參考demo:
#include
#include
輸出結(jié)果:
3
自定義接口
當多個人維護一套代碼的時候,有些同事喜歡調(diào)用庫函數(shù)接口,而有些同事喜歡調(diào)用自定義接口,為了方便統(tǒng)一使用自定義接口或者庫接口,我們會進行如下操作:
參考demo:
#include
#ifndef__DRIVE_H__ #define__DRIVE_H__ #defineprintfprintf("pleaseuseKprintf! "); externvoidKprintf(char*str); #endif
輸出結(jié)果:
這樣下面的代碼你就只能夠使用Kprintf來進行輸出打印,而當我們放開注釋掉的宏,這樣就又可以使用printf了,還是比較方便的。
責任編輯:lq
-
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70744 -
編譯
+關(guān)注
關(guān)注
0文章
679瀏覽量
33995
原文標題:"最常見"卻又"最不常用"的三個預(yù)編譯
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何檢測三極管的三個極
Linux系統(tǒng)中最重要的三個命令
簡述光刻工藝的三個主要步驟
可調(diào)電阻三個腳怎么接 可調(diào)電阻怎么測量好壞
自動發(fā)電控制系統(tǒng)具有三個基本功能
自愈式低壓電容器三個接線柱的正確接法

評論