0
  • 聊天消息
  • 系統(tǒ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ù)里面局部變量定義的位置不對導(dǎo)致的錯(cuò)誤。

針對上面的問題,這個(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)容還是有很多,針對本文說下定義變量位置的區(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)于變量定義的位置也有很多爭議:有的人說為了兼容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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM處理器
    +關(guān)注

    關(guān)注

    6

    文章

    360

    瀏覽量

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

    關(guān)注

    1

    文章

    1607

    瀏覽量

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

    關(guān)注

    4

    文章

    207

    瀏覽量

    31987
收藏 人收藏

    評論

    相關(guān)推薦

    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

    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ā)表于 04-30 15:33

    局部變量超出堆棧范圍,想把占用內(nèi)存多的變量申請?jiān)谌秩绾巫觯?/a>

    目前局部變量超出堆棧范圍,現(xiàn)在想把占用內(nèi)存多的變量申請?jiān)谌?,如何?/div>
    發(fā)表于 03-20 08:03

    為什么stm32cubeide經(jīng)常按住Ctrl+點(diǎn)擊函數(shù)變量無法跳轉(zhuǎn)到對應(yīng)函數(shù)變量定義

    為什么stm32cubeide經(jīng)常按住Ctrl+點(diǎn)擊函數(shù)變量無法跳轉(zhuǎn)到對應(yīng)函數(shù)變量定義。只能用全局搜索去找
    發(fā)表于 03-13 07:59

    C語言中的三種形式變量

    局部變量是在一個(gè)函數(shù)、代碼塊內(nèi)部聲明的變量,只能被該函數(shù)或者代碼塊內(nèi)部應(yīng)用。局部變量函數(shù)之外不
    發(fā)表于 03-11 17:34 ?375次閱讀
    C語言中的三種形式<b class='flag-5'>變量</b>

    淺談C語言中的函數(shù)定義

    如果函數(shù)要使用參數(shù),則必須聲明接受參數(shù)值的變量。這些變量稱為函數(shù)的形式參數(shù)。 形式參數(shù)就像函數(shù)內(nèi)的其他
    發(fā)表于 03-11 10:09 ?290次閱讀

    在多核單片機(jī)中,靜態(tài)局部變量需要?jiǎng)澐址侄涡畔??如何放?b class='flag-5'>函數(shù)對應(yīng)核的ram中?

    請問在多核單片機(jī)中,靜態(tài)局部變量需要?jiǎng)澐址侄涡畔??如何放?b class='flag-5'>函數(shù)對應(yīng)核的ram中?
    發(fā)表于 02-06 06:29

    變量的聲明和定義有什么區(qū)別和聯(lián)系

    變量的聲明和定義是編程中的兩個(gè)重要概念,它們在語法和語義上有一些區(qū)別和聯(lián)系。在本文中,我將詳細(xì)介紹變量的聲明和定義之間的區(qū)別和聯(lián)系。 首先,讓我們從
    的頭像 發(fā)表于 12-07 16:14 ?945次閱讀

    如何在嵌入式C編碼中規(guī)范變量

    防止外部文件的非正常訪問。直接使用其他模塊的私有數(shù)據(jù),將使模塊間的關(guān)系逐漸走向“剪不斷理還亂”的耦合狀態(tài),這種情形是不允許的。 ◎ 避免局部變量與全局變量同名。 說明:盡管局部變量和全局變量
    的頭像 發(fā)表于 12-07 14:42 ?300次閱讀

    oracle sql 定義變量并賦值

    在Oracle SQL中,變量是用來存儲(chǔ)數(shù)據(jù)值的標(biāo)識(shí)符。通過定義和使用變量,我們可以在SQL語句中使用它們來存儲(chǔ)和處理數(shù)據(jù),從而實(shí)現(xiàn)更靈活和動(dòng)態(tài)的查詢和操作。 在Oracle SQL中,定義
    的頭像 發(fā)表于 12-06 10:46 ?2345次閱讀

    for循環(huán)里的變量局部變量

    對于一個(gè)普通for循環(huán)而言,循環(huán)變量局部變量。在大多數(shù)編程語言中,循環(huán)變量只在循環(huán)內(nèi)部的作用域中可見。換句話說,循環(huán)變量的聲明和賦值僅在循環(huán)的每次迭代中有效,并且不能在循環(huán)外部訪問或
    的頭像 發(fā)表于 11-23 14:50 ?2209次閱讀

    python如何定義一個(gè)函數(shù)

    ()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。 二、定義一個(gè)函數(shù) 你可以定義一個(gè)由自己想
    的頭像 發(fā)表于 11-14 11:26 ?651次閱讀

    call stack+locals窗口內(nèi)函數(shù)的加號打不開怎么解決?

    在用keil5的時(shí)候,打開call stack+locals窗口是函數(shù)的加號打不開,看不到局部變量
    發(fā)表于 11-10 06:55

    學(xué)習(xí)STM32單片機(jī),要理解它的堆棧

    程序編譯之后,全局變量,靜態(tài)變量已經(jīng)分配好內(nèi)存空間。在函數(shù)運(yùn)行時(shí),程序需要為局部變量分配棧空間,當(dāng)中斷來時(shí),也需要將函數(shù)指針入棧,保護(hù)現(xiàn)場,
    的頭像 發(fā)表于 10-29 17:12 ?1389次閱讀
    學(xué)習(xí)STM32單片機(jī),要理解它的堆棧

    詳解STM32單片機(jī)堆棧

    程序編譯之后,全局變量,靜態(tài)變量已經(jīng)分配好內(nèi)存空間,在函數(shù)運(yùn)行時(shí),程序需要為局部變量分配??臻g,當(dāng)中斷來時(shí),也需要將函數(shù)指針入棧,保護(hù)現(xiàn)場,
    的頭像 發(fā)表于 10-29 16:41 ?948次閱讀
    詳解STM32單片機(jī)堆棧