在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

關于 函數體內局部變量定義的位置

黃工的嵌入式技術圈 ? 來源:網站整理 ? 2020-03-14 11:43 ? 次閱讀

前面有小伙伴問了這樣一個問題:

我將EWIAR中的一個函數拷貝到MDK-ARM中之后,發現編譯出錯了。為什么在EWARM中可以編譯通過,但在MDK-ARM中會出錯呢?

我一看代碼,基本上判斷問題大概出在什么位置。經過進一步分析得出錯誤原因:就是函數里面局部變量定義的位置不對導致的錯誤。

針對上面的問題,這個問題大家可能在實際項目中不常見,但牽涉的知識也有必要向大家分享。

函數中變量的定義位置

大家先看下代碼中變量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);

}

}

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

上面這段代碼C編譯器編譯會錯嗎?

答案:按照C89標準編譯就會出錯;按照C99標準編譯就不會出錯。

變量定義位置的區別

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

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

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

C99及C++放松了限制,允許在函數體內任意位置聲明變量。C99新的標準滿足了在函數體內定義變量立馬就使用的功能。但是,也要注意變量的作用域。如下面代碼,紅色的語句就會出錯。

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工程默認是支持C99標準的,而MDK-ARM工程默認是不支持C99標準的。所以說,將一個支持C99的標準的代碼拷貝到不支持C99標準的環境中,編譯就會因為代碼而出錯。

MDK-ARM和EWARM只需要修改一下配置就可以支持C99標準,詳情見下面:

1.MDK-ARM的配置

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

2.EWARM的配置

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

關于變量定義的位置也有很多爭議:有的人說為了兼容C89標準,都統一寫在可執行語句前面;有的人則喜歡后面C99標準規定的,這種比較隨性,隨定隨用。我也沒有什么好的建議,看個人吧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM處理器
    +關注

    關注

    6

    文章

    361

    瀏覽量

    41958
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49317
  • MDK
    MDK
    +關注

    關注

    4

    文章

    209

    瀏覽量

    32174
收藏 人收藏

    評論

    相關推薦

    圖紙模板中的文本變量

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

    XC8編譯器調用函數后局域變量值被改變是哪里出了問題?

    最近發現個問題,有個函數里邊調用別的函數后老出錯,查找程序沒有問題,經過仿真后發現在調用一個子函數后有幾個局部變量值會發生改變,再分析原因,發現本
    發表于 07-26 07:36

    XC8調用函數后局域變量值被改變是怎么回事呀!

    最近發現個問題,有個函數里邊調用別的函數后老出錯,查找程序沒有問題,經過仿真后發現在調用一個子函數后有幾個局部變量值會發生改變,再分析原因,發現本
    發表于 04-30 15:33

    請問頭文件能不能定義變量呢?

    最近在編譯一個工程的時候,突然遇到了變量重復定義的問題,根據提示打開這幾個 C 文件,并沒有發現定義變量的地方。后來再找一找,原來變量
    的頭像 發表于 04-28 09:33 ?1276次閱讀

    如何定義多個變量從指定的位置開始存放?

    請教大家一個問題{:3:} 如下面的3個變量這樣定義: u8V1 __attribute__((at(0x20004000))); u16 V2 __attribute__
    發表于 04-17 06:50

    西門子博途關于時間變量的處理

    可以像計算普通數字一樣在 SCL 中計算時間變量,即不需要尋找額外的函數,例如T_COMBINE ,但可以使用簡單的算術。這種方法被稱為“操作數重載”。
    的頭像 發表于 04-15 09:37 ?1417次閱讀

    深度長文:STM32 單片機如何實現軟件控制硬件

    了 test_tmp3。 沒找到test_tmp1/test_tmp2,為什么呢?在定義時,test_tmp3 增加了 static 定義,意思就是靜態局部變量,功能上,相當于全局變量
    發表于 03-20 14:35

    PHP用戶定義函數詳細講解

    還可以根據需要定義函數。這些稱為“用戶定義函數”。 ? 句法: function function-name() ?{ ? ? statement 1 : ? ? statement
    的頭像 發表于 03-20 14:27 ?454次閱讀

    局部變量超出堆棧范圍,想把占用內存多的變量申請在全局如何做?

    目前局部變量超出堆棧范圍,現在想把占用內存多的變量申請在全局,如何做
    發表于 03-20 08:03

    C程序中可用的存儲類有哪些?

    register 存儲類用于定義存儲在寄存器中而不是 RAM 中的局部變量。這意味著變量的最大尺寸等于寄存器的大小(通常是一個詞),且不能對它應用一元的 '&' 運算符(因為它沒有內存
    發表于 03-15 12:32 ?412次閱讀

    為什么stm32cubeide經常按住Ctrl+點擊函數變量無法跳轉到對應函數變量定義

    為什么stm32cubeide經常按住Ctrl+點擊函數變量無法跳轉到對應函數變量定義。只能用全局搜索去找
    發表于 03-13 07:59

    C語言中的三種形式變量

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

    淺談C語言中的函數定義

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

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般
    的頭像 發表于 03-07 11:13 ?442次閱讀
    <b class='flag-5'>函數</b>指針與回調<b class='flag-5'>函數</b>的應用實例

    變量位置不同會死機?郭天祥老師視頻的遺留問題分析答案

    在郭天祥老師視頻里有一個問題分享,是EXMC初始化里的一個變量定義和初始化位置不同會導致程序死機,最終定位到程序是進入hardfault死機,但暫時沒有后續分析了,這里我們來繼續分析一下。
    的頭像 發表于 02-26 09:12 ?414次閱讀
    <b class='flag-5'>變量</b><b class='flag-5'>位置</b>不同會死機?郭天祥老師視頻的遺留問題分析答案
    主站蜘蛛池模板: 正在播放一区二区 | 欧美人交性视频在线香蕉 | 2022年国产精品久久久久 | 日本一区免费看 | 天天摸天天做 | 亚洲香蕉久久一区二区三区四区 | tube性欧美另类 | 狠狠色丁香婷婷久久 | 美女扒尿口给男人桶到爽 | 国内精品久久久久影院免费 | 国内精品久久久久影院男同志 | 明日花绮罗在线观看 | 色综合视频在线 | 黄色男人的天堂 | 女人张腿让男桶免费视频网站 | 黄网在线看 | 日本动漫天堂 | 中文字幕佐山爱一区二区免费 | 国产性片在线观看 | 欧美福利二区 | 亚洲免费视频网址 | 天天玩天天干 | 色视视频| 天天干天天色天天干 | 一级特级毛片免费 | 狠狠色丁香婷婷综合激情 | 人成电影免费观看在线 | 最近最新视频中文字幕4 | 国产二区三区 | 中文在线最新版天堂bt | 黄色片xxx| 欧美亚洲综合在线观看 | 天天插天天爱 | 五月婷婷免费视频 | 天堂bt在线 | 黄 色 成 年人在线 黄a大片 | 在线观看国产一级强片 | 成人窝窝午夜看片 | 99pao在线视频精品免费 | 免费人成年短视频在线观看免费网站 | 最新亚洲一区二区三区四区 |