精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    360

    瀏覽量

    41663
  • 編譯器
    +關注

    關注

    1

    文章

    1618

    瀏覽量

    49049
  • MDK
    MDK
    +關注

    關注

    4

    文章

    209

    瀏覽量

    32033
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    C語言中的三種形式變量

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

    淺談C語言中的函數定義

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

    在多核單片機中,靜態局部變量需要劃分分段信息嗎?如何放到函數對應核的ram中?

    請問在多核單片機中,靜態局部變量需要劃分分段信息嗎?如何放到函數對應核的ram中?
    發表于 02-06 06:29

    傳遞函數定義是什么 傳遞函數的拉氏反變換是什么響應

    傳遞函數定義: 傳遞函數是一種數學工具,用于描述線性時不變系統(LTI系統)的輸入與輸出之間的關系,通常用H(s)表示。傳遞函數是Laplace變換的
    的頭像 發表于 02-01 10:53 ?3947次閱讀

    sgnx函數的概念、特征和用途

    sgnx函數的概念、特征和用途 sgnx函數是一種特殊的數學函數,用于對實數進行非線性變換。 在數學中,sgnx函數定義為一個單側
    的頭像 發表于 12-11 13:38 ?4016次閱讀

    變量的聲明和定義有什么區別和聯系

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

    如何在嵌入式C編碼中規范變量

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

    oracle sql 定義變量并賦值

    在Oracle SQL中,變量是用來存儲數據值的標識符。通過定義和使用變量,我們可以在SQL語句中使用它們來存儲和處理數據,從而實現更靈活和動態的查詢和操作。 在Oracle SQL中,定義
    的頭像 發表于 12-06 10:46 ?2686次閱讀