新聞中心
本文由創(chuàng)新互聯(lián)(www.cdcxhl.com)小編為大家整理,本文主要介紹了c語言在函數(shù)里能定義變量相關知識,希望對你有一定的參考價值和幫助,記得關注和收藏網(wǎng)址哦!

成都創(chuàng)新互聯(lián)專注于堆龍德慶企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設公司,商城網(wǎng)站建設。堆龍德慶網(wǎng)站建設公司,為堆龍德慶等地區(qū)提供建站服務。全流程按需開發(fā),專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
c語言在函數(shù)里能定義變量嗎?
在 C(。cpp文件是按照C標準編譯的),根據(jù)語法,我們可以在任何位置定義變量,只要在使用之前聲明和定義變量,對位置沒有特殊要求。例如,在函數(shù)中任何地方出現(xiàn)的For循環(huán)中,許多學生可以 t分不清C和C的區(qū)別,用VC的時候,源代碼文件也是。默認為CPP。很多同學平時懶得改成。c后綴,而且感覺運行時也一樣。函數(shù)名類型和形參類型要一致嗎?
c語言中定義的子函數(shù)的返回值類型和參數(shù)類型之間沒有規(guī)定,可以相同也可以不同。為什么有的宏用函數(shù)實現(xiàn)就不正常了?
謝謝你。讓 讓我們從這樣一個結(jié)論開始:不是所有的函數(shù)宏定義都可以被普通函數(shù)方便地替代(請注意單詞 "方便地 ").相信題主也知道這一點。
我上次的回答介紹了使用宏定義實現(xiàn)一套 "超時機制和對于C語言程序。這個機制不使用普通的函數(shù),因為宏可以帶來很大的便利。
可惜還在審核中(已經(jīng)超過36小時)。避免 "笨重 "代碼。然而,該 "超時 "C語言中的機制并不難實現(xiàn)。最后一個答案建立了一套非常簡單的 "超時 "通過使用usleep()函數(shù)。既然還沒批下來,相關的C語言代碼就在這里再寫一遍。請看:
上面的C語言代碼會阻塞對就緒位的等待,但不會無限期等待,最多等待5000ms(即5秒)。這種處理雖然粗糙,但確實可以解決 "無限的等待 ",但是僅僅等待就緒位就需要編寫三行代碼。如果有很多地方可以做 "超時 "處理,整個C語言代碼看起來很啰嗦。
如果你算上 "超時 "判斷語句if(get_cur_ms()-otime = 5000),至少需要4行代碼。
程序員小明想到把上面略顯繁瑣的 "超時 "c語言代碼轉(zhuǎn)換成函數(shù)。他認為:封裝之后,如果你想使用 "超時 "函數(shù),你只需要一行函數(shù)調(diào)用,所以他寫了下面的C語言代碼:
小明定義的cond_timeout()函數(shù)接收兩個參數(shù):cond參數(shù)表示等待的條件,timeout參數(shù)表示最大等待時間(單位為ms)。如果cond條件在超時期限內(nèi)仍然無效,cond_timeout()函數(shù)返回1表示等待cond超時,否則返回0表示cond條件已成功等待。
在定義了cond_timeout()函數(shù)后,小明將在上一節(jié)中等待。 "超時 "就緒位的c語言代碼:
修改為:
修改后的C語言代碼確實更加簡潔,但是好用嗎?我們編譯這段代碼并執(zhí)行:
奇怪,thread()的thread函數(shù)明明在2秒后就設置好了。為什么它仍然輸出 "暫停 "?小明對此感到不解。
其實分析小明遇到的問題就像是腦筋急轉(zhuǎn)彎。如果讀者像小明一樣困惑,那一定是因為他們沒有 不要反應。cond_timeout()函數(shù)不執(zhí)行的原因是:;t工作如小明所料很簡單:cond參數(shù)只是cond_timeout()函數(shù)被調(diào)用時的狀態(tài),然后線程函數(shù)thread()無論如何修改ready都不會影響cont_timeout()函數(shù)中的cond。
以上 "超時 "c語言代碼can 不要被封裝。想用的時候只能一行一行寫?當然,封裝 "超時 "代碼作為一種功能。它也可以封裝為一個宏:
上面的C語言代碼比較簡單,一個值得說明的竅門是把{}放在()里,這樣整個cond_timeout宏就相當于一個語句,這是Linux內(nèi)核中相當常見的宏定義方法。
Cond_timeout宏__cond條件成立,或者等待__cond條件成立超過__timeout,就會達到(!(__cond))此時這一行:
很明顯,如果此時cond成立,cond_timeout宏返回的0表示 "等待條件尚未超時否則,cond_timeout宏返回的1表示 "等待條件失敗,超時。
現(xiàn)在將cond_timeout寫入主函數(shù),測試是否能正常工作。修改后的C語言代碼如下,請看:
編譯并執(zhí)行這段C語言代碼,得到如下結(jié)果:
因為thread()函數(shù)在2秒后設置就緒,所以cond_timeout宏沒有返回超時?,F(xiàn)在將thread()函數(shù)中的sleep(2)改為sleep(6)。相關的C語言代碼如下。請看:
編譯并執(zhí)行修改后的C語言代碼,得到如下結(jié)果:
一切都符合預期。
從這一節(jié)的總結(jié)可以看出,define宏定義有時候可以做函數(shù)做不到的事情。實際上,你可以理解定義宏定義只是暫時的包裝和包裝C語言代碼。如果調(diào)用宏,編譯器將展開包。所以,define宏定義實際上只是為幾行代碼取了一個名字。我們使用gcc -E命令獲取經(jīng)過編譯器預處理的C語言代碼:
# gcc -E t.c獲得以下結(jié)果:
可以看出,define宏定義cond_timeout本身并不生成相關的預處理代碼,而是編譯器直接在被調(diào)用的地方展開宏代碼,與函數(shù)不同。
歡迎在評論區(qū)一起討論提問。文章都是手工原創(chuàng),每天用最簡單的介紹C語言、linux等嵌入式開發(fā)。如果你喜歡我的文章,就關注一下,可以看到最近的更新和之前的文章。
c語言中主函數(shù)定義的變量在整個文件中有效?
沒有。;不工作。因為main中定義的變量只在main中有效,所以它不是全局變量,而是局部變量。它對其他函數(shù)中定義的傳輸變量沒有影響。為了達到這種效果,可以使用宏定義來定義全局變量。主函數(shù)中定義的變量是局部變量,全局變量要放在所有函數(shù)中。網(wǎng)頁標題:c語言在函數(shù)里能定義變量嗎?(函數(shù)名類型和形參類型要一致嗎?)
本文鏈接:http://m.fisionsoft.com.cn/article/dhochch.html


咨詢
建站咨詢
