函數未聲明導致返回值錯誤

11月23日

我在計算cpu的使用率。代碼中定義了一個用於計算cpu使用率的函數cal_cpuoccupy(),返回值爲double,具體原型爲:

double cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)

剩下的工作就是調用,調用時發現:double cpu = cal_cpuoccupy(),return的結果cpu,%f打印出來死活不對,是一個亂掉的數字。。。
11月24日 我繼續調試這個問題,我發現將變量double cpu作爲結果參數傳入cal_cpuoccupy(),結果是正確的的,打印地址也都是對的,修改後的原型爲:

double cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n, double *s)

但是返回值依舊不正確

在網上看到一句話給了我啓發:函數沒有寫返回類型,那麼默認爲int。

我馬上寫了個函數測試了下,gcc編譯器會報警告:return type defaults to ‘int’,我的測試函數定義爲func { ... },看到這我就想,我的函數有定義,但是沒有聲明,那麼編譯器會不會把這個函數返回值默認設置爲int呢,有可能,所以我在代碼中,調用前加入了extren聲明瞭外部函數,試了之後發現,函數的返回值終於正確了!

確實是這樣,真的是這樣?我又想到了,如果是這樣,那麼編譯和鏈接肯定會對函數有什麼不一樣的操作,應該在深入瞭解一下,果然又發現一句話:

        C語言並不強行要求函數在使用前先聲明。如果你在代碼中寫了一個未聲明的函數,那麼編譯器編譯到這裏時會假設這個函數的參數列表就是你使用它的這些參數類型,而返回值爲int型,如果之後的編譯鏈接中發現這個函數的真正定義並不是編譯器假設的那樣,再報錯。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章