chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

C語(yǔ)言-函數(shù)未聲明引發(fā)的怪異現(xiàn)象

嵌入式那些事 ? 來(lái)源:嵌入式那些事 ? 2023-04-04 09:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.問(wèn)題描述

最近進(jìn)行ARM嵌入式系統(tǒng)開(kāi)發(fā)過(guò)程中遇到一個(gè)問(wèn)題,就是打印浮點(diǎn)數(shù)據(jù)不正確。這里的打印函數(shù)在其他文件定義的,在main.c中調(diào)用了打印函數(shù),但是并沒(méi)有include打印函數(shù)的頭文件,編譯能夠正確的編譯過(guò)去,但是打印浮點(diǎn)數(shù)據(jù)時(shí)浮點(diǎn)數(shù)據(jù)的內(nèi)容始終不正確,比如kprintf("float_num:%f ", 12.06);實(shí)際顯示的內(nèi)容可能是0.0000。

最開(kāi)始以為浮點(diǎn)的堆棧處理問(wèn)題,后來(lái)檢查浮點(diǎn)的入棧和出棧并沒(méi)有什么問(wèn)題,后來(lái)調(diào)試發(fā)現(xiàn)kprintf("float_num:%f ", 12.06);這句代碼的匯編格式使用d0在保存浮點(diǎn)數(shù)據(jù),正常來(lái)說(shuō)ARM傳遞參數(shù)使用的是r0,r1,r2,r3寄存器或者堆棧,這明顯就不對(duì),采用的貌似是編譯器的通用參數(shù)處理方式。當(dāng)然了導(dǎo)致這個(gè)問(wèn)題的原因就是kprintf這個(gè)函數(shù)并未聲明,因?yàn)閗printf函數(shù)未聲明,編譯器在編譯當(dāng)前文件時(shí),并不知道kprintf函數(shù)的參數(shù)及順序,因此采用的貌似是編譯器的通用參數(shù)處理方式。

kprintf函數(shù)未聲明時(shí),kprintf("float_num:%f ", 12.06);對(duì)應(yīng)的匯編代碼為:

vldrd0,[pc,#188]
ldrr0,[pc,#200]
blkprintf

kprintf函數(shù)在main.c文件中聲明了時(shí),kprintf("float_num:%f ", 12.06);對(duì)應(yīng)的匯編代碼為:

addr3,pc,#252
ldrdr2,r3,[r3]
ldrr0,[pc,#188]
blkprintf

函數(shù)未聲明除了造成上述問(wèn)題之外(參數(shù)傳入的不正確導(dǎo)致結(jié)果出錯(cuò)),也可能導(dǎo)致結(jié)果正確,但是返回的結(jié)果不正確(比如一個(gè)函數(shù)返回double型的結(jié)果,如果函數(shù)未聲明就使用,可能會(huì)返回4字節(jié)的結(jié)果,導(dǎo)致結(jié)果返回錯(cuò)誤)。

函數(shù)未聲明時(shí),kprintf("int_num:%d ", 15);能夠正確的顯示,因?yàn)榇藭r(shí)15這個(gè)值能夠通過(guò)普通寄存器(r0/r1/r2/r3)傳遞,因此不會(huì)出現(xiàn)打印浮點(diǎn)數(shù)的問(wèn)題。如果傳遞的參數(shù)或者返回的值,不能通過(guò)普通寄存器(r0/r1/r2/r3)傳遞時(shí),就可能出現(xiàn)奇怪的問(wèn)題了。

2.問(wèn)題解決方法

解決這個(gè)問(wèn)題的方法自然是,在使用到kprintf的文件中include打印函數(shù)kprintf的頭文件。

3.小結(jié)

對(duì)于開(kāi)發(fā)過(guò)程中,如果編譯時(shí)提示"warning: implicit declaration of function 'xxx'"這類的信息,一定還是加上這些函數(shù)的聲明。如果不添加函數(shù)聲明,編譯雖然能夠通過(guò),但是遇到我上面提及的怪異問(wèn)題,調(diào)試可能都不知如何下手,謹(jǐn)記吧。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9353

    瀏覽量

    377565
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

    317588
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

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

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64884
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    679

    瀏覽量

    33995

原文標(biāo)題:C語(yǔ)言-函數(shù)未聲明引發(fā)的怪異現(xiàn)象

文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    編譯后提示這個(gè)函數(shù)未聲明

    編譯后提示這個(gè)函數(shù)未聲明function "InitXintf" declared implicitly FLASH.c /lab14-39VF800/SRC line 16 C/
    發(fā)表于 08-30 11:03

    為什么編譯時(shí)有Warning說(shuō)這個(gè)函數(shù)有定義未聲明

    在LWIP1.3里面dns.c里面有定義了一個(gè)static u32_t dns_lookup(const char *name){。。。。}并且在dns.h里面進(jìn)行了聲明static u32_t dns_lookup(const char *name);為什么編譯時(shí)有Wa
    發(fā)表于 10-30 22:29

    在nuclei studio中編譯遇到的兩個(gè)問(wèn)題,計(jì)數(shù)模塊顯示未聲明和如何在c工程中添加硬件描述語(yǔ)言?

    core_feature_base.h,卻可以在編譯的時(shí)候使用core_feature_base.h聲明計(jì)數(shù)模塊函數(shù) 2.使用nice接口的Verilog文件 可以與c語(yǔ)言軟件程序一
    發(fā)表于 08-16 07:06

    C語(yǔ)言回調(diào)函數(shù)學(xué)習(xí)

    對(duì)指針的應(yīng)用是C語(yǔ)言編程的精髓所在,而回調(diào)函數(shù)就是C語(yǔ)言里面對(duì)函數(shù)指針的高級(jí)應(yīng)用。簡(jiǎn)而言之,回調(diào)
    發(fā)表于 05-27 09:44 ?7302次閱讀

    C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)

    C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù),使用C語(yǔ)言編程時(shí),常用到的函數(shù)。
    發(fā)表于 05-11 16:41 ?0次下載

    C語(yǔ)言scanf函數(shù)詳解

    C語(yǔ)言scanf函數(shù)詳細(xì)解釋
    發(fā)表于 05-15 09:20 ?6次下載

    基于C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)

    基于C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)
    發(fā)表于 10-23 17:41 ?11次下載
    基于<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>標(biāo)準(zhǔn)庫(kù)<b class='flag-5'>函數(shù)</b>

    C語(yǔ)言聲明和定義與引用說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言聲明和定義與引用說(shuō)明
    發(fā)表于 07-29 08:00 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>聲明</b>和定義與引用說(shuō)明

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

    「1、什么是C語(yǔ)言的隱式函數(shù)聲明」 在C語(yǔ)言中,函數(shù)
    的頭像 發(fā)表于 05-25 09:38 ?4309次閱讀
    剖析什么是<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的隱式<b class='flag-5'>函數(shù)</b><b class='flag-5'>聲明</b>

    51單片機(jī)實(shí)戰(zhàn)教程之C語(yǔ)言基礎(chǔ)(五 C語(yǔ)言函數(shù)及其定義)

    雖然部分C語(yǔ)言函數(shù)的返回值與其參數(shù)存在對(duì)應(yīng)關(guān)系,但是它與數(shù)學(xué)里的函數(shù)不是同一概念。有的書(shū)上把它定義為完成特定任務(wù)的代碼集合。 C
    發(fā)表于 11-21 09:51 ?31次下載
    51單片機(jī)實(shí)戰(zhàn)教程之<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>基礎(chǔ)(五 <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>函數(shù)</b>及其定義)

    C語(yǔ)言函數(shù)速查手冊(cè)

    c\c++語(yǔ)言函數(shù)速查手冊(cè)
    發(fā)表于 06-30 14:48 ?11次下載

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

    C語(yǔ)言函數(shù)是非常重要的知識(shí)點(diǎn),一個(gè)完整的C語(yǔ)言程序就是由主函數(shù)和各個(gè)子
    的頭像 發(fā)表于 08-14 09:57 ?2330次閱讀

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

    C語(yǔ)言中,函數(shù)在調(diào)用前不一定非要聲明被調(diào)用的函數(shù)。如果沒(méi)有聲明的話,那么編譯器會(huì)自動(dòng)按照一種隱
    的頭像 發(fā)表于 02-15 15:02 ?1384次閱讀

    C語(yǔ)言函數(shù)參數(shù)介紹

    C語(yǔ)言數(shù)組元素作函數(shù)實(shí)參 數(shù)組元素可以用作函數(shù)實(shí)參,不能用作形參。 C語(yǔ)言在用數(shù)組元素作
    的頭像 發(fā)表于 03-10 14:30 ?2962次閱讀

    C語(yǔ)言內(nèi)部函數(shù)與外部函數(shù)介紹

    一般為了敘述方便,把建立存儲(chǔ)空間的聲明稱定義,而把不需要建立存儲(chǔ)空間的聲明稱為聲明。 在函數(shù)中出現(xiàn)的對(duì)變量的聲明,除了用extern
    的頭像 發(fā)表于 03-10 14:36 ?1491次閱讀