山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省
可能有些人弄不清楚定義與聲明有什么區別,它們是否是一回事。有人認為聲明就是定義,有人認為只有賦了值的才是定義。在C語言的學習中,關于定義與聲明這兩個名詞的使用上始終存在著混淆。不僅許多初學者沒有搞清楚,連不少介紹C語言的教材也沒有給出準確的介紹。
一個函數一般由兩部分組成:聲明部分和執行語句。聲明部分的作用是對有關的標識符(如變量、函數、結構體、共用體等)的屬性進行聲明。對于函數而言,聲明和定義的區別是明顯的,函數的聲明是函數的原型,而函數的定義是對函數功能的定義。對被調用函數的聲明是放在主調函數的聲明部分中的,而函數的定義顯然不在聲明部分的范圍內,它是一個獨立的模塊。
對變量而言,聲明與定義的關系稍微復雜一些。在聲明部分出現的變量有兩種情況:一種是需要建立存儲空間的(如“inta;”),另一種是不需要建立存儲空間的(如“externa ;”)。前者稱為定義性聲明( defining declaration ),或簡稱定義(definition);后者稱為引用性聲明( referencing declaration )。廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“int a;”而言,它既是聲明,又是定義;而對“externa;”而言,它是聲明而不是定義。
一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。
顯然這里指的聲明是狹義的,即非定義性聲明。
外部變量定義和外部變量聲明的含義是不同的。外部變量的定義只能有一次,它的位置在所有函數之外。
在同一文件中,可以有多次對同一外部變量的聲明,它的位置可以在函數之內(哪個函數要用就在哪個函數中聲明),也可以在函數之外。系統根據外部變量的定義(而不是根據外部變量的聲明)分配存儲單元。
對外部變量的初始化只能在“定義”時進行,而不能在“聲明”中進行。所謂“聲明”,其作用是聲明該變量是一個已在其他地方已定義的外部變量,僅僅是為了擴展該變量的作用范圍而作的“聲明”。
注意:有一個簡單的結論,在函數中出現的對變量的聲明(除了用extern聲明的以外)都是定義。在函數中對其他函數的聲明不是函數的定義。