基礎篇 C 中宣告和定義的區別

2021-06-27 17:23:49 字數 1988 閱讀 5203

在c和c++中,宣告和定義的概念經常容易混淆

在由多個檔案構成的程式中,乙個檔案的函式可能經常需要訪問來自於其他檔案的函式或者變數,因此在編譯過程中,編譯器必須要知道另一些檔案中有哪些函式和變數,尤其是它們的基本用法。因為編譯器需要確保來自其他檔案的資料也能被正確的使用而不是錯誤的使用帶來不可預知的錯誤。

在c和c++中,有兩種常見的和編譯器交流的方式:定義(definition)和宣告(declaration)。

告知編譯器外部函式或變數的名稱及型別,這一過程就是宣告,宣告過程中編譯器不為程式設計師所宣告的物件分配單元,只是讓編譯器知道怎樣檢查對宣告物件的引用以確保不出錯。

而定義的意思是,建立乙個新的資料,告訴編譯器,「我要在此處建立乙個新的變數/函式」,不論程式設計師所分配的物件是變數或函式,編譯器都會立即為該物件分配記憶體空間。(對於變數來說,編譯器所分配的記憶體空間就是該變數的型別所佔的位元組數;而對於函式,編譯器根據其函式體生成相應的**,再通過其決定所劃分的記憶體空間大小)。

值得一提的就是,在c和c++中,我們可以在多個地方宣告相同的變數或函式,但定義只能進行一次。一旦出現了多個相同的定義,編譯器將會毫不猶豫的報錯。

下面我們來分情況討論變數和函式的宣告與定義的區別。

1.函式的定義和宣告

變數的宣告實質就是告知編譯器該變數的外貌特徵。正如前文所述,宣告更像是在提醒編譯器,這個變數在**的某個地方出現過。比如下面這條語句:

int x ;
這句話的本意是宣告乙個整型變數 x ,告知編譯器有乙個已存在的變數 x 。但同時,這行**也有足夠的資訊使得編譯器為變數 x 分配一塊新的記憶體單元, 而事實上編譯器也確實這麼做了。由此可見,正常情況下,變數的宣告很容易被當做定義被編譯器執行,從而產生不可預知的錯誤。

幸運的是,在c++中,有乙個特定的關鍵字用來修飾變數,告訴編譯器「這裡只是乙個變數的宣告,它的定義在其他的地方」。這個關鍵字就是extern,它表示該變數是在檔案的後面或者是其他檔案中定義的。

關鍵字extern 的用法是:

extern int x ;
在變數定義前加關鍵字extern表示宣告乙個變數但不定義他。這個時候編譯器不會為整型變數 x 分配單元,而是在**的其他處尋找該變數的定義。

2.函式的生命和定義

函式的宣告是給函式取名,並且指定函式的返回值型別以及引數型別。例如:

int sum(int first , int second) ;
它表示宣告了乙個名為sum的函式,這個函式會返回乙個整型變數,並且這個函式需要兩個整型變數作為引數,這兩個整型變數引數在該函式中分別被重新定義為整型變數first、整型變數second,最後的分號標誌宣告結束。

函式的定義方式類似於函式宣告,但是區別在於,函式的定義需要函式體,否則編譯器無法為該函式分配記憶體單元。函式體是乙個用大括號圍起來的**集,用大括號表示這段**的開始和結束。例如

int sum(int first , int second)

在這段**中,表示了乙個名為sum的函式的定義,它的功能是返回兩個整型變數first、second相加的和。並且在函式的定義中,大括號代替分毫的作用,因為大括號表示的是乙個語句集。 

而有趣的是,extern也可以用於函式的宣告。例如:

extern int sum(int first , int second) ;
關鍵字extern在修飾變數時非常有效,但遺憾的是,extern對函式來說卻是非常多餘的。其原因很簡單,如果在與語句中出現了函式體,編譯器必定會將它視作函式的定義;反之,如果沒有出現函式體,編譯器也必定會將它視作函式的定義,extern便失去了意義

以上是code::blocks上的測試結果,在函式的定義中,即便加上了extern,編譯器識別到函式體之後也會自動的將其視為函式定義。

C中宣告和定義的區別

對變數來說,宣告 declaration 指向編譯器說明變數的型別和名字 定義 definition 指向編譯器說明變數的型別和名字的同時,為變數分配記憶體,可指定初值也可不指定。可以看出,定義包含於宣告中,平常最常見的 int var 就是一種宣告,或者說未指定初值的定義。兩者的其他區別如下 1....

C 宣告和定義的區別

宣告是告知編譯器該程式元素的名稱以及型別,定義則是使編譯器為程式元素分配記憶體空間。二者最根本的區別就是是否分配記憶體。宣告不會導致記憶體的分配,而定義會分配記憶體。在c 程式中宣告可以有多次,但是定義只能有一次。因此不能將變數的定義放置於標頭檔案中,由於標頭檔案會被多次引用,就會導致變數在多個原始...

c 宣告和定義的區別

c 程式通常由許多檔案組成,為了讓多個檔案訪問相同的變數,c 區分了宣告和定義。變數的定義 definition 用於為變數分配儲存空間,還可以為變數指定初始值。在程式中,變數有且僅有乙個定義。宣告 declaration 用於向程式表明變數的型別和名字。定義也是宣告 當定義變數的時候我們宣告了它的...