前言
什么是C語言的隱式函數聲明。
在C語言中,函數在調用前不一定非要聲明被調用的函數。如果沒有聲明的話,那么編譯器會自動按照一種隱式聲明的規則,為調用函數的C代碼產生匯編代碼。
如何踩坑的?
首先說明的是,在一份優先的源代碼中,編譯時通常是不會出現關于函數隱式聲明的警告。
因為有著嚴格的編程規范,防止出現這種情況
請看下面的代碼樣例,有什么問題嗎?
#include
int main(void)
{
int val = sqrt(4);
printf("sqrt = %d", val);
}
在使用函數sqrt
時沒有包含頭文件
,在通過 IDE 軟件編譯鏈接時,通常會給出隱式函數聲明的警告,很多初學者一般不怎么在意,只會在乎編譯是否報錯,因為只要能編譯通過,程序就能正常運行。
然而,忽略隱式函數聲明的警告程序就一定能正常運行嗎?
根據隱式函數聲明規則,編譯器在編譯時如果碰到這種問題,會自動按照一種隱式聲明的規則,為調用函數的C代碼產生匯編代碼,或者查找與隱式聲明同名的函數。
如上述的代碼示例中隱式聲明的函數原型為:
int sqrt(int);
而對于的同名函數原型為:
double sqrt(double);
由于隱式函數聲明,函數的返回值類型和參數類型均不一樣,導致了錯誤的調用方式,在實際運行過程中極有可能出現錯誤。
特別是嵌入式軟件開發,會接觸很多系列的MCU平臺,有著不一樣的IDE軟件可以開發,同樣的代碼,如果存在函數隱式聲明的情況,在不同的IDE軟件編譯下,可能某一個編譯下載后運行正常,而另一個IDE軟件編譯下載后卻異常了,甚至出現跑飛的情況,那么一定要關注函數隱式聲明的警告。
預防及解決措施
- 首先可以從代碼規范約束學起,調用某個模塊的函數一定要包含對應的頭文件,且頭文件有該函數的聲明。
- 注意所有的警告,有些警告十分值得重視,盡量消除所有的警告
- 在gcc編譯時,可以增加編譯選項
-Werror=implicit-function-declaration
將警告設置為錯誤
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
相關推薦
在systemverilog中,如果一個類沒有顯式地聲明構造函數(new()),那么編譯仿真工具會自動提供一個隱
發表于 11-16 09:58
?3583次閱讀
添加了Generated庫文件,我能夠成功構建。但是我得到了一個警告:隱式聲明函數“Adter”。但是我在圖書館項目中聲明了
發表于 05-28 12:24
#hello,JS:03-02 聲明提前和立即執行函數
發表于 07-08 06:04
在我的項目中,我有41個輸入輸出引腳使用。在我的兩個功能中,我喜歡函數讀銷和寫別針。BuffTimple函數聲明警告我不是添加PIN。h每增加一個奇數。我的函數H。任何其他解決方案請告
發表于 09-29 12:58
:warning:(361)函數聲明為隱式int.,這似乎對代碼的實際編譯或運行沒有任何影響,但是它有點煩人。有什么想法,為什么這個特定的功能是扔這個警告?
發表于 10-24 13:23
您好,我現在正在使用PIC16F18313,在代碼中,我聲明了一個變量,它位于我放入的示例代碼中,問題是,我收到一個警告:隱式簽名到無符號轉換,我不知道是什么原因或者如何修復它。關于我的問題:希望你能得到一個很好的回答。謝謝。
發表于 04-07 14:06
為實現高效安全的信息存儲,在分析訪問權限控制與加密技術等數據保護措施及現有文件隱寫系統的基礎上,提出基于NTFS文件系統的最小侵入式隱寫
發表于 03-31 10:30
?17次下載
隱函數、方程求根、不動點和迭代7.1知識要點與背景 7.1.1 隱函數存在定理與四連桿機構的運動 7.1.2 不動點和
發表于 10-17 00:35
?1853次閱讀
基于隱式PIGPC的網絡控制系統時延補償方法_田中大
發表于 01-07 18:21
?0次下載
「1、什么是C語言的隱式函數聲明」 在C語言中,函數在調用前不一定非要聲明。如果沒有
發表于 05-25 09:38
?3752次閱讀
其中,返回值的類型和位寬是可選項,如果缺省會返回一位寄存器類型數據。Verilog HDL認為函數的定義隱式地聲明了與函數同名的寄存器。
發表于 07-02 10:24
?2286次閱讀
函數處; 相當于不用執行進入函數的步驟,直接執行函數體; 相當于宏,卻比宏多了類型檢查,真正具有函數特性; 編譯器一般不內聯包含循環、遞歸、switch 等復雜操作的內聯
發表于 09-09 09:38
?2121次閱讀
C語言里函數是非常重要的知識點,一個完整的C語言程序就是由主函數和各個子函數組成的,主函數調用子函數完成各個邏輯功能。 這篇文章作為C語言
發表于 08-14 09:57
?1905次閱讀
在實際開發中,Qt中很多類可以直接作為函數參數傳遞,這是為什么?其背后的實現機制又是什么?這些都歸功于隱式共享
發表于 02-12 16:52
?750次閱讀
在啟動目標應用組件時,會通過顯式[Want]或者隱式[Want]進行目標應用組件的匹配,這里說的匹配規則就是調用方傳入的[want]參數中設置的參數如何與目標應用組件聲明的配置文件進行
發表于 06-06 14:30
?431次閱讀
評論