91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

    文章

    361

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

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

    關(guān)注

    4

    文章

    211

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    如何規(guī)范用、但不濫用局部變量(Local Variable)

    局部變量當(dāng)成“共享內(nèi)存的快捷通道”,它確實(shí)方便,但代價(jià)是:數(shù)據(jù)流變暗、可讀性下降、容易引入競態(tài)(race condition)。 適用場景(更“合理”的用法) 只讀:多個(gè)位置需要讀取同一個(gè)
    發(fā)表于 02-04 08:42

    容易造成單片機(jī)內(nèi)存溢出的幾個(gè)陷阱介紹

    訪問的故障了。 棧區(qū):根據(jù)上面Demo程序?qū)懙奈覀冎?b class='flag-5'>局部變量是存在于“棧區(qū)”的,所以一般我們的局部變量通常不要定義的太大,尤其是一些數(shù)組變量,如果說非常大,就會(huì)占用非常大的棧區(qū)空間,
    發(fā)表于 01-23 07:25

    堆棧的原理揭秘

    。 3. 堆棧的功能是怎么實(shí)現(xiàn)的?說的那么玄乎,堆棧和局部變量到底是怎么減少內(nèi)存占用的呢? 3.1 軟件的角度:從功能實(shí)現(xiàn)的角度講,函數(shù)實(shí)參和局部變量其實(shí)都可以用全局變量來實(shí)現(xiàn)。 但
    發(fā)表于 01-23 07:08

    值傳遞、指針傳遞、引用傳遞介紹

    進(jìn)行操作,也就是說,即使形參的值發(fā)生改變,實(shí)參的值也完全不受影響。   2、指針傳遞:指針傳遞其實(shí)是值傳遞的一種,它傳遞的是地址。值傳遞過程中,被調(diào)函數(shù)的形參作為被調(diào)函數(shù)局部變量來處理,即在
    發(fā)表于 01-21 06:48

    C語言編程-局部性原理

    循環(huán)迭代中被引用一次,對于 sum 來說,有好的時(shí)間局部性。另外,sum 為標(biāo)量,沒有空間局部性。 向量 v 的元素是被順序讀取的,按照它們存儲(chǔ)在內(nèi)存中的順序一個(gè)接一個(gè)。對于變量 v ,函數(shù)
    發(fā)表于 01-07 06:01

    嵌入式C語言中各變量存儲(chǔ)位置

    存的了解比較精準(zhǔn)。經(jīng)常需要操作的內(nèi)存可分為以下幾個(gè)類別: 1、棧區(qū)(stack)— 由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。 2、堆區(qū)
    發(fā)表于 12-25 07:54

    C語言全局變量重點(diǎn)使用

    重要的循環(huán)中我們不建議使用全局變量。 如果函數(shù)過多的使用全局變量,比較好的做法是拷貝全局變量的值到局部變量, 這樣它才可以存放在寄存器。這
    發(fā)表于 12-12 06:58

    三種類型內(nèi)存的使用

    自動(dòng)存儲(chǔ):用于保存局部變量。當(dāng)函數(shù)被調(diào)用時(shí),就會(huì)創(chuàng)建一個(gè)新的自動(dòng)存儲(chǔ)區(qū)域,并在函數(shù)返回結(jié)果時(shí)刪除。只有返回值會(huì)被保留,并被復(fù)制到調(diào)用它的函數(shù)的自動(dòng)存儲(chǔ)中。這意味著,返回一個(gè)指向
    發(fā)表于 12-12 06:43

    使用setjmp及l(fā)ongjmp函數(shù)處理異常

    // 定義一個(gè)全局的env變量 jmp_buf env; // 定義一個(gè)可能發(fā)生錯(cuò)誤的函數(shù) void foo(int x) { // 如果x為0,則發(fā)生除零錯(cuò)誤,跳轉(zhuǎn)到env
    發(fā)表于 12-11 08:00

    第7章 變量進(jìn)階與點(diǎn)陣LED(7.1 7.2)

    知識(shí)——變量的作用域和存儲(chǔ)類別。 7.1變量的作用域 所謂的作用域就是指變量起作用的范圍,也是變量的有效范圍。變量按他的作用域可以分為
    的頭像 發(fā)表于 12-10 16:25 ?358次閱讀

    Stack棧到底用來干嘛的呢?

    Stack_Size就是棧大小,0x00000400就是代表有1K(0x400/1024)的大小。 那這個(gè)棧到底用來干嘛的呢? 比如說我們函數(shù)的形參、以及函數(shù)定義局部變量就是存儲(chǔ)在
    發(fā)表于 12-01 08:04

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件中已經(jīng)定義;用在函數(shù)上作用同全局變量; static:用在全局
    發(fā)表于 11-21 07:05

    C語言開發(fā)單片機(jī)為什么大多數(shù)都采用全局變量的形式?

    單片機(jī)的芯片資源從來都是 “精打細(xì)算” 的級別,CPU 主頻普遍不高,RAM 總?cè)萘勘揪途o張,分給??臻g的更是少得可憐。要是像普通軟件那樣,依賴函數(shù)返回值傳遞數(shù)據(jù)、頻繁用局部變量周轉(zhuǎn),一來二去占用
    的頭像 發(fā)表于 11-12 14:29 ?436次閱讀
    C語言開發(fā)單片機(jī)為什么大多數(shù)都采用全局<b class='flag-5'>變量</b>的形式?

    按照芯來文檔設(shè)置可以通過segger IDE debug了,但是沒法看全局或者局部變量值,怎么解決?

    如題,按照芯來文檔設(shè)置可以通過segger IDE debug了,但是沒法看全局或者局部變量值,很麻煩。有遇到過解決了的嗎?
    發(fā)表于 10-20 09:20

    關(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