c語(yǔ)言隱式函數(shù)聲明

一直覺(jué)得寫(xiě)了這么久代碼,對(duì)c,或者c++的掌握還算不錯(cuò),可是最近才發(fā)現(xiàn),不了解的細(xì)節(jié)實(shí)在太多了。
比如下面這個(gè)例子:

// 1. c
int print_float(float f)
{
    return print("%f\n", f);
}
// 2. c
int main()
{
    int a = 1;
    
    print_float(a);
    
    return 0;
} 

gcc -c *.c && gcc -o test *.o && ./test

很簡(jiǎn)單的一段代碼,可是打印出來(lái)的結(jié)果卻是:
0.000000
為什么會(huì)出現(xiàn)這樣的結(jié)果?其實(shí)就是題目中說(shuō)道的:c的隱式聲明。

如果沒(méi)有關(guān)于被調(diào)函數(shù)的特定信息,編譯器便假定在這個(gè)函數(shù)的調(diào)用時(shí)傳遞的參數(shù)類型和個(gè)數(shù)都是正確的,同時(shí)會(huì)假定函數(shù)返回一個(gè)整數(shù)類型的值。
但是如果被調(diào)函數(shù)的返回值不是整型,或者實(shí)參與形參不匹配,都將導(dǎo)致函數(shù)調(diào)用出現(xiàn)錯(cuò)誤。

這個(gè)問(wèn)題看似簡(jiǎn)單,卻可以隱藏的非常深,而解決方式也無(wú)非就是秉持一種良好的編程習(xí)慣:

任何時(shí)候,都要聲明函數(shù)。

比如在上面的例子中,只需要在main函數(shù)前面聲明:int print_float(flat f),就可以了。

c和c++中類似這樣的小問(wèn)題,數(shù)不勝數(shù)。看來(lái)永遠(yuǎn)都沒(méi)有精通c++的那一天了,想想都覺(jué)得好傷感。
(原文時(shí)間2014-3-18)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近在編程時(shí)遇到一個(gè)bug,通過(guò)gdb定位到printf函數(shù),卻怎么也找不到原因。從網(wǎng)上這篇博客中發(fā)現(xiàn)了問(wèn)題所在:...
    creepycool閱讀 2,011評(píng)論 0 0
  • 動(dòng)態(tài)鏈接,在可執(zhí)行文件裝載時(shí)或運(yùn)行時(shí),由操作系統(tǒng)的裝載程序加載庫(kù)。大多數(shù)操作系統(tǒng)將解析外部引用(比如庫(kù))作為加載過(guò)...
    小5筒閱讀 5,778評(píng)論 0 3
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,675評(píng)論 0 4
  • 函數(shù)基本概念 C源程序是由函數(shù)組成的例如: 我們前面學(xué)習(xí)的課程當(dāng)中,通過(guò)main函數(shù)+scanf函數(shù)+printf...
    極客江南閱讀 1,753評(píng)論 1 14
  • pwd返回了根目錄 這時(shí)候看到系統(tǒng)返回了一個(gè) /,這個(gè) / 被我們稱為系統(tǒng)的 根目錄(root),這個(gè)位置也就是我...
    夏威夷的芒果閱讀 1,174評(píng)論 0 1

友情鏈接更多精彩內(nèi)容