變數和函式的宣告與定義(C C )

2021-06-16 06:21:32 字數 1611 閱讀 8060

在c語言編碼經常是:變數與函式的宣告 放在標頭檔案中,它們相應的定義 放在原始檔中。

有時候由於**簡單為了方便看,我們並沒有這麼規範的做,而是都寫在了一起。

加上變數的宣告和定義同時存在,這樣一來給人的誤解是:覺得宣告即是定義,定義即是宣告。造成這種混淆並不奇怪,因為變數在大多數情況下,宣告的同時就定義了

有人說,「我不分清楚也一樣看**,一樣寫c程式「。可是想想大多數人寫程式的思路都是:模仿——>實踐 。 一般都是從書上的小例子看起或者別人的**。 若不加思考和容易造成「知其然不知其所以然「。搞清楚這些看似無傷程式的事情會提高程式設計水平和素養。

開始正題

1. 變數的宣告和定義是一起的(從**上看)

e.g.

1. int var; //宣告的同時也對其定義了

int main(int argc, char **argv)

而如下是純粹的宣告,沒有包含定義

e.g.

2. extern int val; //僅僅宣告這是個外部變數,extern的後邊再講。

3. extern int val1 = 1; // 宣告並定義外部變數

int main(int argc, char **argv)

但是二者並不是同時進行的:在編譯階段,變數的宣告在起作用。這樣後邊對該變數的引用是不會有錯的;在彙編階段用到的是定義,為變數申請空間。。。所以2 處為宣告不分配空間,3 處有 定義是要分配空間的

2. 而函式的宣告與定義也是類似的。而且要更容易區分。一句話:有(即函式體)的是定義 ;沒有函式體的就是宣告

e.g.

void func() //即是宣告也是定義

int main(int argc, char **argv)

僅僅對函式宣告的話,就不需要寫函式體,只要宣告函式型別以及函式形參的資訊就可以了。

e.g.

void func(char); //僅僅是宣告

int main(int argc, char **argv)

void func(char *str) //函式定義,如果此檔案中沒有這部分定義的話,main中可以編譯,但不能 鏈結

之所以函式的定義與宣告比較好區分是因為函式必須得有函式體編譯器才能給它分配空間,才算是定義,這樣函式的定義和宣告會很明顯看出;而變數僅僅需要要個名字和它的型別(這恰恰又是宣告的方式)編譯器就可以分配空間給它(定義的方式)。所以就混在一起。。。

深一步說,宣告只是告訴編譯器宣告的變數和函式是存在的,但並沒有真正分配空間給它,所以當後面的**用到前面宣告的變數或函式時,編譯器在編譯的時候不會報錯,但是在鏈結的時候會報錯,因為鏈結的時候編譯器會去尋找這些變數和函式的記憶體位址,因為只宣告了但沒定義,鏈結器當然找不到它們了,所以就報錯了。而對它們進行定義了的話編譯器就會給它們分配空間,它們就有自己的位址了,這時就能鏈結了。

這就是為什麼所以定義只能有一次(

定義是要分配空間的

);而宣告不分配空間,你可以宣告多次的原因。 所以像

2. extern int val;這樣的語句可以寫多次 (在多個檔案裡

都有宣告)而

3. extern int val1 = 1; // 宣告並定義外部變數只能寫一次,如果在別的檔案裡要引用就要都寫成2中的形式啦!

c c 變數定義與宣告

我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下 望我的指點對你受益 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種...

C C 變數定義與宣告的區別

變數定義與宣告的區別 我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下 變數的宣告有兩種情況 1 一種是需要建立儲存空間的 定義 宣告 例如 int a在宣告的時候就已經建立了儲存空間...

c c 中變數的宣告和定義

不管是函式還是變數的宣告,都是為了告訴編譯器我要使用這個變數或者函式了,用於型別檢查。在定義的時候編譯器是不會分配任何記憶體的,比如下面的函式 void func 當函式執行到int a 的時候,這是乙個宣告,編譯器不會為其分配記憶體空間。當執行到a 0 這是乙個定義,編譯器才會為其分配記憶體空間。...