C语言再学习 -- 声明与定义
生活随笔
收集整理的這篇文章主要介紹了
C语言再学习 -- 声明与定义
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
什么是定義?什么是聲明?它們有何區(qū)別?
舉個例子:
A)int i;
B)extern int i; (關于 extern,后面解釋)
哪個是定義?哪個是聲明?或者都是定義或者都是聲明?我所教過的學生幾乎沒有一
人能回答上這個問題。這個十分重要的概念在大學里從來沒有被提起過!
什么是定義:所謂的定義就是(編譯器)創(chuàng)建一個對象,為這個對象分配一塊內(nèi)存并給它
取上一個名字,這個名字就是我們經(jīng)常所說的變量名或?qū)ο竺5⒁?#xff0c;這個名字一旦和
這塊內(nèi)存匹配起來(可以想象是這個名字嫁給了這塊空間,沒有要彩禮啊。 ^_^),它們就同
生共死,終生不離不棄。并且這塊內(nèi)存的位置也不能被改變。一個變量或?qū)ο笤谝欢ǖ膮^(qū)
域內(nèi)(比如函數(shù)內(nèi),全局等)只能被定義一次,如果定義多次,編譯器會提示你重復定義
同一個變量或?qū)ο蟆?什么是聲明:有兩重含義,如下:
第一重含義:告訴編譯器,這個名字已經(jīng)匹配到一塊內(nèi)存上了(伊人已嫁,吾將何去何
從?何以解憂,唯有稀粥),下面的代碼用到變量或?qū)ο笫窃趧e的地方定義的。聲明可以出
現(xiàn)多次。
第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變量
名或?qū)ο竺1热缒阍趫D書館自習室的某個座位上放了一本書,表明這個座位已經(jīng)有人預
訂,別人再也不允許使用這個座位。其實這個時候你本人并沒有坐在這個座位上。這種聲
明最典型的例子就是函數(shù)參數(shù)的聲明,例如:
void fun(int i, char c);
好,這樣一解釋,我們可以很清楚的判斷:A)是定義; B)是聲明。
那他們的區(qū)別也很清晰了。記住, 定義聲明最重要的區(qū)別:定義創(chuàng)建了對象并為這個
對象分配了內(nèi)存,聲明沒有分配內(nèi)存(一個抱伊人,一個喝稀粥。 ^_^)。
聲明(declaration )指定了一個變量的標識符,用來描述變量的類型,是類型還是對象,或者函數(shù)等。聲明,用于編譯器(compiler)識別變量名所引用的實體。以下這些就是聲明:
extern int bar;
extern int g(int, int);
double f(int, double); // 對于函數(shù)聲明,extern關鍵字是可以省略的。
class foo; // 類的聲明,前面是不能加class的。
定義是對聲明的實現(xiàn)或者實例化。連接器(linker)需要它(定義)來引用內(nèi)存實體。與上面的聲明相應的定義如下:
int bar;
int g(int lhs, int rhs) {return lhs*rhs;}?
double f(int i, double d) {return i+d;}?
class foo {};// foo 這里已經(jīng)擁有自己的內(nèi)存了,對照上面兩個函數(shù),你就應該明白{}的用處了吧?
無論如何,定義 操作是只能做一次的。如果你忘了定義一些你已經(jīng)聲明過的變量,或者在某些地方被引用到的變量,那么,連接器linker是不知道這些引用該連接到那塊內(nèi)存上的。然后就會報missing symbols 這樣的錯誤。如果你定義變量超過一次,連接器是不知道把引用和哪塊內(nèi)存連接,然后就會報 duplicated symbols這樣的錯誤了。以上的symbols其實就是指定義后的變量名,也就是其標識的內(nèi)存塊。
總結(jié):
如果只是為了給編譯器提供引用標識,讓編譯器能夠知道有這個引用,能用這個引用來引用某個實體(但沒有為實體分配具體內(nèi)存塊的過程)是為聲明。如果該操作能夠為引用指定一塊特定的內(nèi)存,使得該引用能夠在link階段唯一正確地對應一塊內(nèi)存,這樣的操作是為定義。聲明是為了讓編譯器正確處理對聲明變量和函數(shù)的引用。定義是一個給變量分配內(nèi)存的過程,或者是說明一個函數(shù)具體干什么用。轉(zhuǎn)自: c語言中聲明和定義的區(qū)別
總結(jié)
以上是生活随笔為你收集整理的C语言再学习 -- 声明与定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网晚报 | 3月2日 星期三 |
- 下一篇: mybatis动态sql标签的使用