如何優(yōu)雅的屏蔽別人的警告
本文轉(zhuǎn)載自微信公眾號「魚鷹談單片機」,作者魚鷹Osprey。轉(zhuǎn)載本文請聯(lián)系魚鷹談單片機公眾號。
或許剛?cè)腴T的小菜鳥都會被學(xué)長告知,警告不用管,沒有錯誤就行!
正是這一句話,導(dǎo)致很多初學(xué)者都不會注意警告問題。
魚鷹當(dāng)時也是這樣被教育的,但沒聽。
無它,既然編譯器報出了警告,那就說明有不合理的地方,肯定可以想辦法解決的。所以,不管是警告還是錯誤,魚鷹都會一個個上網(wǎng)尋找解決方案,因此,魚鷹的工程基本都是 0 警告,0錯誤(當(dāng)然 0 錯誤是必須的,不然無法生成目標(biāo)文件)。
最常見的警告是有個函數(shù)沒有聲明,或者有個變量聲明了沒有使用,這里介紹一種快速解決該警告的方法:
函數(shù)沒有聲明:
這樣,只要在使用前聲明即可(C99模式)。雖然不是很規(guī)范,但這是最快解決該類警告的方式,比每次編譯跳出一堆警告好得多了。
變量沒有使用,一般是打印需要或者調(diào)試需要,定義了變量,沒有使用或者僅僅是賦值,沒有讀取該變量的操作,此時可以采用如下方式解決:
這兩種警告確實無傷大雅,但有些警告如果你不關(guān)注的話,程序運行異常是很正常的事情(比如函數(shù)沒有定義),所以魚鷹的建議是 0 警告,這樣,每次編譯跳出警告時,你都可以快速定位這個是不是自己新改代碼的警告,同時可以發(fā)現(xiàn)自己代碼隱藏的問題。
那么,如果別人實在是不愿意處理警告又該如何呢?
在稍大一些的項目,一般都是由多人合作開發(fā)的,如果同事上傳的代碼存在警告,而他又一直沒有處理,同時你自己又不能隨便修改別人的代碼。
你在開發(fā)時,每次跳出一個警告,你都要看一下這個警告是不是自己代碼產(chǎn)生的(強迫癥),而代碼修改、編譯是常有的事情,這樣勢必影響自己的開發(fā)進度。
還有一種情況是,使用別人的開源代碼,這個源代碼可能是很久以前寫的,以前編譯器可以通過這種寫法,到現(xiàn)在的編譯器可能就無法通過了,但同時你測試發(fā)現(xiàn),這些警告不會影響功能。
那么是否可以屏蔽這些文件的警告呢?
有些人在工程里面直接屏蔽了所有警告:
這對于其他需要警告來保證開發(fā)效率的人來說,這就是災(zāi)難,因為前面魚鷹說過,一些警告不可忽視。
還有一種稍好一些的是屏蔽部分特定警告:
但是這些配置都會對整個工程產(chǎn)生作用,是否有一種更好的方法,只屏蔽部分文件,其他文件的警告不受影響呢?
事實上,MDK軟件已經(jīng)提供了這個功能。前面提到的那種對整個工程設(shè)置的方式是最常用的,接下來還有兩種不是很常用的:
1、對某個文件關(guān)閉警告:
打開配置選項
選擇 C/C++ 選項卡
此時,你可以看到熟悉的配置選項,按照需要配置即可。
并且這些配置只針對一個文件有效果,對其他文件不起作用。
2、對某個文件夾關(guān)閉警告:
MDK 使用了虛擬文件夾,雖然不存在于實際文件系統(tǒng)中,但方便我們管理工程文件,同時也給了我們配置該文件夾的可能。
這樣,如果有太多文件需要關(guān)閉警告,我們可以將其整合在一塊,一次性關(guān)閉這些文件的警告(比如將有警告的開源代碼放一起)。
當(dāng)然,我們也可以據(jù)此來關(guān)閉某些特定警告,而不必將所有警告都關(guān)閉了,方法和對整個工程配置那里類似。
除此之外,我們還可以通過在代碼中添加特定內(nèi)容來達到消除警告的目的,比如(一般這種代碼如果沒有使用的話,將產(chǎn)生警告,只能屏蔽它):
或者明確指定該代碼不應(yīng)該發(fā)出某種警告。
因為這些內(nèi)容魚鷹也用的不是很多,就不再細說。