前言
什么是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
將警告設置為錯誤
-
C語言
+關注
關注
180文章
7624瀏覽量
139512 -
函數
+關注
關注
3文章
4363瀏覽量
63710 -
編譯器
+關注
關注
1文章
1651瀏覽量
49691
發布評論請先 登錄
相關推薦
SystemVerilog中的類構造函數new
隱式函數聲明警告
為什么會出現函數對void函數聲明隱式int警告?
隱式有符號到無符號轉換
基于NTFS的最小侵入式隱寫系統
隱函數、方程求根、不動點和迭代
Verilog HDL語言中任務與函數的比較
C++基礎語法之inline 內聯函數
C語言-函數的定義、聲明、傳參
鴻蒙Ability Kit(程序框架服務)【顯式Want與隱式Want匹配規則】

評論