C語言再學習 宣告與定義

2021-07-17 02:51:07 字數 1854 閱讀 8599

什麼是定義?什麼是宣告?它們有何區別?

舉個例子:

a)int i;

b)extern int i; (關於 extern,後面解釋)

哪個是定義?哪個是宣告?或者都是定義或者都是宣告?我所教過的學生幾乎沒有一

人能回答上這個問題。這個十分重要的概念在大學裡從來沒有被提起過!

什麼是定義:所謂的定義就是(編譯器)建立乙個物件,為這個物件分配一塊記憶體並給它

取上乙個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和

這塊記憶體匹配起來(可以想象是這個名字嫁給了這塊空間,沒有要彩禮啊。 ^_^),它們就同

生共死,終生不離不棄。並且這塊記憶體的位置也不能被改變。乙個變數或物件在一定的區

域內(比如函式內,全域性等)只能被定義一次,如果定義多次,編譯器會提示你重複定義

同乙個變數或物件。

什麼是宣告:有兩重含義,如下:

第一重含義:告訴編譯器,這個名字已經匹配到一塊記憶體上了(伊人已嫁,吾將何去何

從?何以解憂,唯有稀粥),下面的**用到變數或物件是在別的地方定義的。宣告可以出

現多次。

第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變數

名或物件名。比如你在圖書館自習室的某個座位上放了一本書,表明這個座位已經有人預

訂,別人再也不允許使用這個座位。其實這個時候你本人並沒有坐在這個座位上。這種聲

明最典型的例子就是函式引數的宣告,例如:

void fun(int i, char c);

好,這樣一解釋,我們可以很清楚的判斷:a)是定義; b)是宣告。

那他們的區別也很清晰了。記住, 定義宣告最重要的區別:定義建立了物件並為這個

物件分配了記憶體,宣告沒有分配記憶體(乙個抱伊人,乙個喝稀粥。 ^_^)。

宣告(declaration )指定了乙個變數的識別符號,用來描述變數的型別,是型別還是物件,或者函式等。宣告,用於編譯器(compiler)識別變數名所引用的實體。以下這些就是宣告:

extern int bar;

extern int g(int, int);

double f(int, double); // 對於函式宣告,extern關鍵字是可以省略的。

class foo; // 類的宣告,前面是不能加class的。

定義是對宣告的實現或者例項化。聯結器(linker)需要它(定義)來引用記憶體實體。與上面的宣告相應的定義如下:

int bar;

int g(int lhs, int rhs)  

double f(int i, double d)  

class foo {};// foo 這裡已經擁有自己的記憶體了,對照上面兩個函式,你就應該明白{}的用處了吧?

無論如何,定義 操作是只能做一次的。如果你忘了定義一些你已經宣告過的變數,或者在某些地方被引用到的變數,那麼,聯結器linker是不知道這些引用該連線到那塊記憶體上的。然後就會報missing symbols 這樣的錯誤。如果你定義變數超過一次,聯結器是不知道把引用和哪塊記憶體連線,然後就會報 duplicated symbols這樣的錯誤了。以上的symbols其實就是指定義後的變數名,也就是其標識的記憶體塊。

總結:

如果只是為了給編譯器提供引用標識,讓編譯器能夠知道有這個引用,能用這個引用來引用某個實體(但沒有為實體分配具體記憶體塊的過程)是為宣告。如果該操作能夠為引用指定一塊特定的記憶體,使得該引用能夠在link階段唯一正確地對應一塊記憶體,這樣的操作是為定義。

宣告是為了讓編譯器正確處理對宣告變數和函式的引用。定義是乙個給變數分配記憶體的過程,或者是說明乙個函式具體幹什麼用。

**: c語言中宣告和定義的區別

C語言再學習1 定義變數

變數 於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。在指令式語言中,變數通常是可變的 int x 10 變數型別 變數名 變數值 char 8bit 1位元組short 16bit 2位元組int 32bit 4位元組log 32bit 4位元組當我們在c語言裡建立...

C語言的定義與宣告

1.變數的定義 宣告 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種是不需要建立儲存空間的。例如 extern int a 其中變數a是在別的檔案中定義的。前者是 定義性宣告 defining declaration 或者稱為 定義...

C語言宣告與定義

很久沒接觸c語言了,今天遇到宣告與定義的問題,於是找到下面的解釋 宣告 declaration 指定了乙個變數的識別符號,用來描述變數的型別,是型別還是物件,或者函式等。宣告,用於編譯器 compiler 識別變數名所引用的實體。以下這些就是宣告 extern int bar extern int ...