一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

關(guān)于 函數(shù)體內(nèi)局部變量定義的位置

黃工的嵌入式技術(shù)圈 ? 來源:網(wǎng)站整理 ? 2020-03-14 11:43 ? 次閱讀

前面有小伙伴問了這樣一個(gè)問題:

我將EWIAR中的一個(gè)函數(shù)拷貝到MDK-ARM中之后,發(fā)現(xiàn)編譯出錯(cuò)了。為什么在EWARM中可以編譯通過,但在MDK-ARM中會(huì)出錯(cuò)呢?

我一看代碼,基本上判斷問題大概出在什么位置。經(jīng)過進(jìn)一步分析得出錯(cuò)誤原因:就是函數(shù)里面局部變量定義的位置不對(duì)導(dǎo)致的錯(cuò)誤。

針對(duì)上面的問題,這個(gè)問題大家可能在實(shí)際項(xiàng)目中不常見,但牽涉的知識(shí)也有必要向大家分享。

函數(shù)中變量的定義位置

大家先看下代碼中變量a、b、c、d定義的位置:

void Test(void)

{

char a;

printf("a = %d\n", a);

char b;

printf("b = %d\n", b);

for(char c = 0;c < 10; c++)

{

char d;

printf("c = %d\n", c);

printf("d = %d\n", d);

}

}

以上變量定義位置,相信很多人都看到過,有些朋友在實(shí)際編程中也常這么定義在這些位置。

上面這段代碼C編譯器編譯會(huì)錯(cuò)嗎?

答案:按照C89標(biāo)準(zhǔn)編譯就會(huì)出錯(cuò);按照C99標(biāo)準(zhǔn)編譯就不會(huì)出錯(cuò)。

變量定義位置的區(qū)別

相信很多朋友在大學(xué)的時(shí)候都學(xué)過C和C++,學(xué)過C++的朋友都知道,上面那段代碼變量定義的位置是很合理的。

但不知道大家了解過C89和C99的區(qū)別,區(qū)別的內(nèi)容還是有很多,針對(duì)本文說下定義變量位置的區(qū)別。

C89標(biāo)準(zhǔn)是不允許在函數(shù)中隨便位置聲明變量,C語言中的變量聲明不能放在任何可執(zhí)行語句之后,只允許在函數(shù)(可執(zhí)行語句)的開始處。如上一段代碼,需要在【printf("a = %d\n", a);】這條語句之前。

C99及C++放松了限制,允許在函數(shù)體內(nèi)任意位置聲明變量。C99新的標(biāo)準(zhǔn)滿足了在函數(shù)體內(nèi)定義變量立馬就使用的功能。但是,也要注意變量的作用域。如下面代碼,紅色的語句就會(huì)出錯(cuò)。

void Test(void)

{

for(char c = 0; c < 10; c++)

{

printf("c = %d\n", c);

}

printf("c = %d\n", c);

}

MDK-ARM和EWARM中C99的配置

文章開篇說的問題,就是出在IDE的配置上。EWARM工程默認(rèn)是支持C99標(biāo)準(zhǔn)的,而MDK-ARM工程默認(rèn)是不支持C99標(biāo)準(zhǔn)的。所以說,將一個(gè)支持C99的標(biāo)準(zhǔn)的代碼拷貝到不支持C99標(biāo)準(zhǔn)的環(huán)境中,編譯就會(huì)因?yàn)榇a而出錯(cuò)。

MDK-ARM和EWARM只需要修改一下配置就可以支持C99標(biāo)準(zhǔn),詳情見下面:

1.MDK-ARM的配置

Project -> Options for Target -> C/C++ 勾選上“C99 Mode”即可。

2.EWARM的配置

Project -> Options -> C/C++ Compiler -> Language 1 選中上“C99”即可。

關(guān)于變量定義的位置也有很多爭(zhēng)議:有的人說為了兼容C89標(biāo)準(zhǔn),都統(tǒng)一寫在可執(zhí)行語句前面;有的人則喜歡后面C99標(biāo)準(zhǔn)規(guī)定的,這種比較隨性,隨定隨用。我也沒有什么好的建議,看個(gè)人吧。

聲明:本文內(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)投訴
  • ARM處理器
    +關(guān)注

    關(guān)注

    6

    文章

    361

    瀏覽量

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

    關(guān)注

    1

    文章

    1652

    瀏覽量

    49741
  • MDK
    MDK
    +關(guān)注

    關(guān)注

    4

    文章

    209

    瀏覽量

    32432
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【解決方案】變頻電機(jī)的局部放電測(cè)試

    出,提高電機(jī)的質(zhì)量與安全性。依據(jù)IEC標(biāo)準(zhǔn)的兩項(xiàng)局部放電測(cè)試,旨在實(shí)現(xiàn)多維度的潛在不良檢測(cè),具體內(nèi)容如下交流局部放電(ACPD)測(cè)試符合標(biāo)準(zhǔn):IEC60270、IEC6
    的頭像 發(fā)表于 04-21 09:59 ?117次閱讀
    【解決方案】變頻電機(jī)的<b class='flag-5'>局部</b>放電測(cè)試

    Ansible Playbook中的變量使用技巧

    在inventory中定義的連接變量(比如ansible_ssh_user);優(yōu)先級(jí)第二。
    的頭像 發(fā)表于 04-15 10:26 ?143次閱讀

    關(guān)于STM32 CAN通信發(fā)送函數(shù)HAL_CAN_AddTxMessage()的最后一個(gè)參數(shù)填0和定義一個(gè)變量取地址的問題求解

    問題: 關(guān)于STM32 CAN通信 發(fā)送函數(shù) HAL_CAN_AddTxMessage()的最后一個(gè)參數(shù)填0和定義一個(gè)變量取地址的問題,如果直接傳0,我實(shí)驗(yàn)發(fā)現(xiàn) STM32F103C8
    發(fā)表于 03-11 08:22

    關(guān)于中斷知識(shí)學(xué)習(xí)總結(jié)筆記

    、局部變量等資源。例如,可以在普通函數(shù)中隨意定義和使用局部變量,并且在函數(shù)內(nèi)部對(duì)全局變量的訪問也
    發(fā)表于 11-23 11:23

    圖紙模板中的文本變量

    進(jìn)行定義。無論是系統(tǒng)內(nèi)置的變量,還是用戶自定義變量,都以這種方式表述。 系統(tǒng)內(nèi)置文本變量 以下表格展示系統(tǒng)內(nèi)置的文本
    的頭像 發(fā)表于 11-13 18:21 ?479次閱讀
    圖紙模板中的文本<b class='flag-5'>變量</b>

    SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別

    : 1. 函數(shù)定義 SUMIF函數(shù) :用于對(duì)滿足單一條件的單元格求和。其基本語法為 SUMIF(range, criteria, [sum_range]) ,其中: range :應(yīng)用條件的區(qū)域
    的頭像 發(fā)表于 10-30 09:51 ?6758次閱讀

    鴻蒙原生應(yīng)用元服務(wù)開發(fā)-倉(cāng)頡基本概念程序結(jié)構(gòu)

    () { println(a) } 在非頂層作用域中不能定義上述自定義類型,但可以定義變量函數(shù),稱之為
    發(fā)表于 08-13 10:57

    技術(shù)干貨驛站 ▏深入理解C語言:基本數(shù)據(jù)類型和變量

    語言的知識(shí),為后續(xù)的編程學(xué)習(xí)打下堅(jiān)實(shí)的基礎(chǔ)。1基本數(shù)據(jù)類型在C語言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量函數(shù)的一個(gè)廣泛的系統(tǒng),用于定義變量的類型,以及在編程過程
    的頭像 發(fā)表于 07-26 17:53 ?2499次閱讀
    技術(shù)干貨驛站 ▏深入理解C語言:基本數(shù)據(jù)類型和<b class='flag-5'>變量</b>

    XC8編譯器調(diào)用函數(shù)后局域變量值被改變是哪里出了問題?

    最近發(fā)現(xiàn)個(gè)問題,有個(gè)函數(shù)里邊調(diào)用別的函數(shù)后老出錯(cuò),查找程序沒有問題,經(jīng)過仿真后發(fā)現(xiàn)在調(diào)用一個(gè)子函數(shù)后有幾個(gè)局部變量值會(huì)發(fā)生改變,再分析原因,發(fā)現(xiàn)本
    發(fā)表于 07-26 07:36

    heap連上互聯(lián)網(wǎng)的時(shí)候,heap空間慢慢的就變小了,直到最后程序僵死在那,為什么?

    當(dāng)局域網(wǎng)通訊的時(shí)候,用system_get_free_heap_size()得到heap的大小一直不變的,通訊穩(wěn)定; 但是連上互聯(lián)網(wǎng)的時(shí)候,heap空間慢慢的就變小了,直到最后程序僵死在那。 請(qǐng)問這是什么原因引起的,有什么解決方法嗎?謝謝 另外,大的局部變量已經(jīng)用的zalloc()和free()。
    發(fā)表于 07-12 07:13

    esp-gdbstub無法查看局部變量如何解決?

    我已經(jīng)將 esp-gdbstub 集成到一個(gè)項(xiàng)目中,并且能夠執(zhí)行斷點(diǎn)、單步執(zhí)行等。 However, when I do a backtrace at a breapoint, all the function parameters are labelled with \"error reading variable: can\'t compute CFA for this frame\" and cannot be printed. Same effect is seen when trying to examine some (but not all) local variables. 造成此行為的原因是什么,我該如何解決?
    發(fā)表于 07-11 08:06

    神經(jīng)網(wǎng)絡(luò)中激活函數(shù)定義及類型

    詳細(xì)介紹激活函數(shù)定義、類型。 激活函數(shù)定義和基本功能 2.1 定義 激活函數(shù)(Activat
    的頭像 發(fā)表于 07-02 10:09 ?1039次閱讀

    如何從主機(jī)將數(shù)據(jù)按8bit傳入片上ITCM?

    需求:如何從主機(jī)將數(shù)據(jù)按8bit傳入片上ITCM 我想在PC端(主機(jī))通過8位IO每個(gè)周期傳入8bit數(shù)據(jù)(一共大概32KB的數(shù)據(jù),包括自定義指令和局部變量的數(shù)據(jù),由.verilog文件讀出來
    發(fā)表于 05-24 07:40

    函數(shù)信號(hào)發(fā)生器的定義、功能及應(yīng)用

    隨著現(xiàn)代電子技術(shù)的飛速發(fā)展,電子測(cè)試設(shè)備在科研、生產(chǎn)、教育等領(lǐng)域的應(yīng)用越來越廣泛。其中,函數(shù)信號(hào)發(fā)生器作為一種重要的電子測(cè)試設(shè)備,在電子工程、通信、科研等領(lǐng)域發(fā)揮著至關(guān)重要的作用。本文將詳細(xì)介紹函數(shù)信號(hào)發(fā)生器的定義、分類、功能、
    的頭像 發(fā)表于 05-15 14:42 ?2483次閱讀

    使用IAR定義全局變量出現(xiàn)兩個(gè)同名不同地址變量是什么原因?qū)е碌模?/a>

    使用IAR定義全局變量出現(xiàn)兩個(gè)同名不同地址變量 systickCount和systickFlag都在另一個(gè)c文件里定義的,假設(shè)a.c,然后在a.h里聲明為外部
    發(fā)表于 05-10 06:09