前言
什么是C語言的隱式函數(shù)聲明。
在C語言中,函數(shù)在調(diào)用前不一定非要聲明被調(diào)用的函數(shù)。如果沒有聲明的話,那么編譯器會自動按照一種隱式聲明的規(guī)則,為調(diào)用函數(shù)的C代碼產(chǎn)生匯編代碼。
如何踩坑的?
首先說明的是,在一份優(yōu)先的源代碼中,編譯時通常是不會出現(xiàn)關(guān)于函數(shù)隱式聲明的警告。
因為有著嚴格的編程規(guī)范,防止出現(xiàn)這種情況
請看下面的代碼樣例,有什么問題嗎?
#include 在使用函數(shù)sqrt時沒有包含頭文件
然而,忽略隱式函數(shù)聲明的警告程序就一定能正常運行嗎?
根據(jù)隱式函數(shù)聲明規(guī)則,編譯器在編譯時如果碰到這種問題,會自動按照一種隱式聲明的規(guī)則,為調(diào)用函數(shù)的C代碼產(chǎn)生匯編代碼,或者查找與隱式聲明同名的函數(shù)。
如上述的代碼示例中隱式聲明的函數(shù)原型為:
int sqrt(int);
而對于的同名函數(shù)原型為:
double sqrt(double);
由于隱式函數(shù)聲明,函數(shù)的返回值類型和參數(shù)類型均不一樣,導致了錯誤的調(diào)用方式,在實際運行過程中極有可能出現(xiàn)錯誤。
特別是嵌入式軟件開發(fā),會接觸很多系列的MCU平臺,有著不一樣的IDE軟件可以開發(fā),同樣的代碼,如果存在函數(shù)隱式聲明的情況,在不同的IDE軟件編譯下,可能某一個編譯下載后運行正常,而另一個IDE軟件編譯下載后卻異常了,甚至出現(xiàn)跑飛的情況,那么一定要關(guān)注函數(shù)隱式聲明的警告。
預防及解決措施
- 首先可以從代碼規(guī)范約束學起,調(diào)用某個模塊的函數(shù)一定要包含對應的頭文件,且頭文件有該函數(shù)的聲明。
- 注意所有的警告,有些警告十分值得重視,盡量消除所有的警告
- 在gcc編譯時,可以增加編譯選項-Werror=implicit-function-declaration將警告設(shè)置為錯誤
- 
                                C語言
                                +關(guān)注關(guān)注 183文章 7636瀏覽量 144250
- 
                                函數(shù)
                                +關(guān)注關(guān)注 3文章 4403瀏覽量 66584
- 
                                編譯器
                                +關(guān)注關(guān)注 1文章 1666瀏覽量 50981
發(fā)布評論請先 登錄
SystemVerilog中的類構(gòu)造函數(shù)new
在MPLAB IDE中找不到函數(shù)聲明
隱式函數(shù)聲明警告
為什么會出現(xiàn)函數(shù)對void函數(shù)聲明隱式int警告?
隱式有符號到無符號轉(zhuǎn)換
基于NTFS的最小侵入式隱寫系統(tǒng)
隱函數(shù)、方程求根、不動點和迭代
Verilog HDL語言中任務與函數(shù)的比較
C++基礎(chǔ)語法之inline 內(nèi)聯(lián)函數(shù)
C語言-函數(shù)的定義、聲明、傳參
基于Qt 5.15源碼來聊聊隱式共享
鴻蒙Ability Kit(程序框架服務)【顯式Want與隱式Want匹配規(guī)則】
 
    
 
           
        
 
         隱式函數(shù)聲明會導致系統(tǒng)怎么樣?
隱式函數(shù)聲明會導致系統(tǒng)怎么樣? 
                 
  
     
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評論