0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

隱式函數(shù)聲明會(huì)導(dǎo)致系統(tǒng)怎么樣?

汽車電子技術(shù) ? 來(lái)源:大橙子瘋嵌入式 ? 作者:大橙子瘋 ? 2023-02-15 15:02 ? 次閱讀

前言

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

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

如何踩坑的?

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

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

請(qǐng)看下面的代碼樣例,有什么問題嗎?

#include 

int main(void)
{
    int val = sqrt(4);

    printf("sqrt = %d", val);
}

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

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

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

如上述的代碼示例中隱式聲明的函數(shù)原型為:

int sqrt(int);

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

double sqrt(double);

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

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


預(yù)防及解決措施

  • 首先可以從代碼規(guī)范約束學(xué)起,調(diào)用某個(gè)模塊的函數(shù)一定要包含對(duì)應(yīng)的頭文件,且頭文件有該函數(shù)的聲明。
  • 注意所有的警告,有些警告十分值得重視,盡量消除所有的警告
  • 在gcc編譯時(shí),可以增加編譯選項(xiàng)-Werror=implicit-function-declaration將警告設(shè)置為錯(cuò)誤
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134048
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61965
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48895
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SystemVerilog中的類構(gòu)造函數(shù)new

    在systemverilog中,如果一個(gè)類沒有顯聲明構(gòu)造函數(shù)(new()),那么編譯仿真工具會(huì)自動(dòng)提供一個(gè)
    發(fā)表于 11-16 09:58 ?3417次閱讀

    在MPLAB IDE中找不到函數(shù)聲明

    添加了Generated庫(kù)文件,我能夠成功構(gòu)建。但是我得到了一個(gè)警告:聲明函數(shù)“Adter”。但是我在圖書館項(xiàng)目中聲明
    發(fā)表于 05-28 12:24

    聲明提前和函數(shù)聲明前置

    #hello,JS:03-02 聲明提前和立即執(zhí)行函數(shù)
    發(fā)表于 07-08 06:04

    函數(shù)聲明警告

    在我的項(xiàng)目中,我有41個(gè)輸入輸出引腳使用。在我的兩個(gè)功能中,我喜歡函數(shù)讀銷和寫別針。BuffTimple函數(shù)聲明警告我不是添加PIN。h每增加一個(gè)奇數(shù)。我的函數(shù)H。任何其他解決方案請(qǐng)告
    發(fā)表于 09-29 12:58

    為什么會(huì)出現(xiàn)函數(shù)對(duì)void函數(shù)聲明int警告?

    :warning:(361)函數(shù)聲明int.,這似乎對(duì)代碼的實(shí)際編譯或運(yùn)行沒有任何影響,但是它有點(diǎn)煩人。有什么想法,為什么這個(gè)特定的功能是扔這個(gè)警告?
    發(fā)表于 10-24 13:23

    有符號(hào)到無(wú)符號(hào)轉(zhuǎn)換

    您好,我現(xiàn)在正在使用PIC16F18313,在代碼中,我聲明了一個(gè)變量,它位于我放入的示例代碼中,問題是,我收到一個(gè)警告:簽名到無(wú)符號(hào)轉(zhuǎn)換,我不知道是什么原因或者如何修復(fù)它。關(guān)于我的問題:希望你能得到一個(gè)很好的回答。謝謝。
    發(fā)表于 04-07 14:06

    基于NTFS的最小侵入系統(tǒng)

    為實(shí)現(xiàn)高效安全的信息存儲(chǔ),在分析訪問權(quán)限控制與加密技術(shù)等數(shù)據(jù)保護(hù)措施及現(xiàn)有文件系統(tǒng)的基礎(chǔ)上,提出基于NTFS文件系統(tǒng)的最小侵入
    發(fā)表于 03-31 10:30 ?17次下載

    函數(shù)、方程求根、不動(dòng)點(diǎn)和迭代

    函數(shù)、方程求根、不動(dòng)點(diǎn)和迭代7.1知識(shí)要點(diǎn)與背景  7.1.1   函數(shù)存在定理與四連桿機(jī)構(gòu)的運(yùn)動(dòng)  7.1.2  不動(dòng)點(diǎn)和
    發(fā)表于 10-17 00:35 ?1824次閱讀

    基于PIGPC的網(wǎng)絡(luò)控制系統(tǒng)時(shí)延補(bǔ)償方法

    基于PIGPC的網(wǎng)絡(luò)控制系統(tǒng)時(shí)延補(bǔ)償方法_田中大
    發(fā)表于 01-07 18:21 ?0次下載

    剖析什么是C語(yǔ)言中的函數(shù)聲明

    「1、什么是C語(yǔ)言的函數(shù)聲明」 在C語(yǔ)言中,函數(shù)在調(diào)用前不一定非要聲明。如果沒有
    的頭像 發(fā)表于 05-25 09:38 ?3611次閱讀
    剖析什么是C語(yǔ)言中的<b class='flag-5'>隱</b><b class='flag-5'>式</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>聲明</b>

    Verilog HDL語(yǔ)言中任務(wù)與函數(shù)的比較

    其中,返回值的類型和位寬是可選項(xiàng),如果缺省會(huì)返回一位寄存器類型數(shù)據(jù)。Verilog HDL認(rèn)為函數(shù)的定義聲明了與函數(shù)同名的寄存器。
    的頭像 發(fā)表于 07-02 10:24 ?2197次閱讀

    C++基礎(chǔ)語(yǔ)法之inline 內(nèi)聯(lián)函數(shù)

    函數(shù)處; 相當(dāng)于不用執(zhí)行進(jìn)入函數(shù)的步驟,直接執(zhí)行函數(shù)體; 相當(dāng)于宏,卻比宏多了類型檢查,真正具有函數(shù)特性; 編譯器一般不內(nèi)聯(lián)包含循環(huán)、遞歸、switch 等復(fù)雜操作的內(nèi)聯(lián)
    的頭像 發(fā)表于 09-09 09:38 ?2049次閱讀

    C語(yǔ)言-函數(shù)的定義、聲明、傳參

    C語(yǔ)言里函數(shù)是非常重要的知識(shí)點(diǎn),一個(gè)完整的C語(yǔ)言程序就是由主函數(shù)和各個(gè)子函數(shù)組成的,主函數(shù)調(diào)用子函數(shù)完成各個(gè)邏輯功能。 這篇文章作為C語(yǔ)言
    的頭像 發(fā)表于 08-14 09:57 ?1802次閱讀

    基于Qt 5.15源碼來(lái)聊聊共享

    在實(shí)際開發(fā)中,Qt中很多類可以直接作為函數(shù)參數(shù)傳遞,這是為什么?其背后的實(shí)現(xiàn)機(jī)制又是什么?這些都?xì)w功于共享
    的頭像 發(fā)表于 02-12 16:52 ?673次閱讀

    鴻蒙Ability Kit(程序框架服務(wù))【顯Want與Want匹配規(guī)則】

    在啟動(dòng)目標(biāo)應(yīng)用組件時(shí),會(huì)通過顯[Want]或者[Want]進(jìn)行目標(biāo)應(yīng)用組件的匹配,這里說的匹配規(guī)則就是調(diào)用方傳入的[want]參數(shù)中設(shè)置的參數(shù)如何與目標(biāo)應(yīng)用組件聲明的配置文件進(jìn)行
    的頭像 發(fā)表于 06-06 14:30 ?280次閱讀
    鴻蒙Ability Kit(程序框架服務(wù))【顯<b class='flag-5'>式</b>Want與<b class='flag-5'>隱</b><b class='flag-5'>式</b>Want匹配規(guī)則】