c 宣告和定義

2021-06-18 20:12:55 字數 533 閱讀 3541

標頭檔案中的(全域性)變數只能放宣告,不能定義

標頭檔案中的變數只能宣告,不能定義,否則其他多個.c檔案包含該標頭檔案,出現重複定義,導致鏈結出錯。 

#ifndef #define #endif防止的是「重複編譯」,而不是「重複定義」 

重複編譯可能造成重複定義,但重複定義的**不只有重複編譯 

從**變成可執行的程式,需要兩個步驟 

編譯和鏈結 

編譯開始時,將所有#include標頭檔案的地方替換成該標頭檔案的** 

在編譯階段,編譯所有原始檔成為模組,各模組中的每個變數與函式都得到了屬於自己的空間 

在鏈結階段,各個模組被組合到一起 

#ifndef能夠防止在編譯階段,一段**被重複編譯,並且由此可以避免乙個變數被重複定義 

解決方法:不僅用#ifndef組合防止重複編譯,而且將變數在原始檔中定義,只在標頭檔案裡放extern宣告 

這樣各模組在編譯的時候,就知道「有這麼個變數,但它的空間不在我這裡」,鏈結的時候,這個變數雖然出現在所有包含這個標頭檔案的模組裡,但只有乙個模組是它的真身所在。 

C 宣告和定義

c 宣告和定義 宣告和定義最主要的區別是 宣告不申請記憶體空間而定義申請記憶體空間。定義申請記憶體空間這點需要.好像很多人這樣理解 我怎麼以為這有點問題 這裡有個簡單的錯誤,尤其是對我以c 的情景來理解c 標頭檔案中的 int a 全域性變數這樣寫 在c 中是定義。這裡有個情況是 如果 int a ...

c 的宣告和定義

c 中,除了inline函式和符號常量之外,普通的物件和函式只能被定義一次,所以.h的標頭檔案就用來儲存物件和函式的宣告,而將定義儲存在乙個.cpp中,其它要使用該物件或函式的.cpp檔案就可以包含該.h標頭檔案。同時使用extern字首表示 該物件已經在別處被定義,這裡只是給編譯器乙個提示。同時,...

宣告和定義

宣告 向計算機介紹名字,它說,這個名字是什麼意思 而 定義 為這個名字分配 儲存空間。無論涉及到變數時還是函式時含義都一樣。無論在哪種情況下,編譯器都在 定義 處分配儲存空間。對於變數,編譯器確定這個變數佔多少儲存單元,並在記憶體中產生存放它們 的空間。對於函式,編譯器產生 並為之分配儲存空間。函式...