<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

隱式函數聲明會導致系統怎么樣?

汽車電子技術 ? 來源:大橙子瘋嵌入式 ? 作者:大橙子瘋 ? 2023-02-15 15:02 ? 次閱讀

前言

什么是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

    文章

    7548

    瀏覽量

    131341
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61467
  • 編譯器
    +關注

    關注

    1

    文章

    1585

    瀏覽量

    48743
收藏 人收藏

    評論

    相關推薦

    為什么中斷函數聲明也可以

    用C寫中斷函數時,為什么不聲明也可以用,以前我記得C語言老師說過在調用一個自定義函數以前要進行聲明。 求解??
    發表于 11-26 00:08

    有關頭文件寫法或者函數聲明調用的小技巧分享

    錯,導致運行時代碼無故死機、重啟,有時跟函數聲明、調用的有問題而編譯器沒有報錯,本貼但愿能給出簡單的建設性意見。一般文件聲明、定義、調用的格式如下:應用場景介紹:a.C 文件、a.H文
    發表于 09-27 23:15

    光伏組件的裂和識別及預防

    線和細柵線收集和導出。因此,當裂(多為平行于主柵線的裂)導致細柵線斷裂時,電流將無法被有效輸送至主柵線,從而導致電池片部分乃至整片失效,還可能造成碎片、熱斑等,同時引起組件的功率衰
    發表于 10-15 19:58

    簽名到無符號警告

    您好,我很少關注簽名到無符號轉換警告。為什么所有的變量都被聲明為無符號,我仍然得到這個警告?上面例子中的值是否被視為無符號或有符號字符?在這種情況下,變量“C”的值是150還是其他?同樣,在下
    發表于 11-06 14:43

    .extern main聲明main函數是必須的嗎?

    韋老師的教程里第六課之前的匯編程序里都沒有用.externmain聲明main函數之后的程序又都開始用.externmain聲明main函數這個聲明
    發表于 04-17 07:45

    在MPLAB IDE中找不到函數聲明

    添加了Generated庫文件,我能夠成功構建。但是我得到了一個警告:聲明函數“Adter”。但是我在圖書館項目中聲明
    發表于 05-28 12:24

    聲明提前和函數聲明前置

    #hello,JS:03-02 聲明提前和立即執行函數
    發表于 07-08 06:04

    mysql轉換具體描述

    mysql 轉換問題
    發表于 08-13 06:07

    2D解析

    《Fundamentals of Computer Graphics》翻譯(三):2D直線
    發表于 09-03 12:19

    函數聲明警告

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

    為什么會出現函數對void函數聲明int警告?

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

    有符號到無符號轉換

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

    剖析什么是C語言中的隱式函數聲明

    「1、什么是C語言的隱式函數聲明」 在C語言中,函數在調用前不一定非要聲明。如果沒有聲明,那么編譯器會自動按照一種隱式
    的頭像 發表于 05-25 09:38 ?3420次閱讀
    剖析什么是C語言中的隱式<b class='flag-5'>函數</b><b class='flag-5'>聲明</b>

    C語言-函數的定義、聲明、傳參

    C語言里函數是非常重要的知識點,一個完整的C語言程序就是由主函數和各個子函數組成的,主函數調用子函數完成各個邏輯功能。 這篇文章作為C語言
    的頭像 發表于 08-14 09:57 ?1685次閱讀

    C語言內部函數與外部函數介紹

    一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。 在函數中出現的對變量的聲明,除了用extern
    的頭像 發表于 03-10 14:36 ?912次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>