日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 大橙子瘋嵌入式


前言

什么是C語言的隱式函數(shù)聲明。

在C語言中,函數(shù)在調(diào)用前不一定非要聲明被調(diào)用的函數(shù)。如果沒有聲明的話,那么編譯器會自動按照一種隱式聲明的規(guī)則,為調(diào)用函數(shù)的C代碼產(chǎn)生匯編代碼。

如何踩坑的?

首先說明的是,在一份優(yōu)先的源代碼中,編譯時(shí)通常是不會出現(xiàn)關(guān)于函數(shù)隱式聲明的警告。

因?yàn)橛兄鴩?yán)格的編程規(guī)范,防止出現(xiàn)這種情況

請看下面的代碼樣例,有什么問題嗎?

#include  int main(void) { int val = sqrt(4); printf("sqrt = %d", val);
}

在使用函數(shù)sqrt時(shí)沒有包含頭文件,在通過 IDE 軟件編譯鏈接時(shí),通常會給出隱式函數(shù)聲明的警告,很多初學(xué)者一般不怎么在意,只會在乎編譯是否報(bào)錯,因?yàn)橹灰芫幾g通過,程序就能正常運(yùn)行。

然而,忽略隱式函數(shù)聲明的警告程序就一定能正常運(yùn)行嗎?

根據(jù)隱式函數(shù)聲明規(guī)則,編譯器在編譯時(shí)如果碰到這種問題,會自動按照一種隱式聲明的規(guī)則,為調(diào)用函數(shù)的C代碼產(chǎn)生匯編代碼,或者查找與隱式聲明同名的函數(shù)。
如上述的代碼示例中隱式聲明的函數(shù)原型為:

int sqrt(int);

而對于的同名函數(shù)原型為:

double sqrt(double);

由于隱式函數(shù)聲明,函數(shù)的返回值類型和參數(shù)類型均不一樣,導(dǎo)致了錯誤的調(diào)用方式,在實(shí)際運(yùn)行過程中極有可能出現(xiàn)錯誤。

特別是嵌入式軟件開發(fā),會接觸很多系列的MCU平臺,有著不一樣的IDE軟件可以開發(fā),同樣的代碼,如果存在函數(shù)隱式聲明的情況,在不同的IDE軟件編譯下,可能某一個(gè)編譯下載后運(yùn)行正常,而另一個(gè)IDE軟件編譯下載后卻異常了,甚至出現(xiàn)跑飛的情況,那么一定要關(guān)注函數(shù)隱式聲明的警告。


預(yù)防及解決措施

  • 首先可以從代碼規(guī)范約束學(xué)起,調(diào)用某個(gè)模塊的函數(shù)一定要包含對應(yīng)的頭文件,且頭文件有該函數(shù)的聲明。

  • 注意所有的警告,有些警告十分值得重視,盡量消除所有的警告

  • 在gcc編譯時(shí),可以增加編譯選項(xiàng)-Werror=implicit-function-declaration將警告設(shè)置為錯誤



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉