什麼是定義?什麼是宣告?它們有何區別?
舉個例子:12
a)
int
i;
b)extern
int
i;(關於extern,後面解釋)
哪個是定義?哪個是宣告?或者都是定義或者都是宣告?
什麼是定義:所謂的定義就是(編譯器)建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和這塊記憶體匹配起來(可以想象是這個名字嫁給了這塊空間,沒有要彩禮啊。^_^),它們就同生共死,終生不離不棄。並且這塊記憶體的位置也不能被改變。乙個變數或物件在一定的區域內(比如函式內,全域性等)只能被定義一次,如果定義多次,編譯器會提示你重複定義
同乙個變數或物件。
什麼是宣告:有兩重含義,如下:
第一重含義:告訴編譯器,這個名字已經匹配到一塊記憶體上了(伊人已嫁,吾將何去何從?何以解憂,唯有稀粥),下面的**用到變數或物件是在別的地方定義的。宣告可以出現多次。
第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變數名或物件名。比如你在圖書館自習室的某個座位上放了一本書,表明這個座位已經有人預訂,別人再也不允許使用這個座位。其實這個時候你本人並沒有坐在這個座位上。這種宣告最典型的例子就是函式引數的宣告,例如:
1void
fun(
int
i,
char
c);
好,這樣一解釋,我們可以很清楚的判斷:a)是定義;b)是宣告。
那他們的區別也很清晰了。記住,定義宣告最重要的區別:定義建立了物件並為這個extern 宣告變數是在其他檔案中宣告(也可以看做是引用變數)。
物件分配了記憶體,宣告沒有分配記憶體(乙個抱伊人,乙個喝稀粥。^_^)。
陳正衝老師講c語言之宣告和定義的區別:
宣告(declaration )指定了乙個變數的識別符號,用來描述變數的型別,是型別還是物件,或者函式等。宣告,用於編譯器(compiler)識別變數名所引用的實體。
定義是對宣告的實現或者例項化。聯結器(linker)需要它(定義)來引用記憶體實體。
無論如何,定義 操作是只能做一次的。如果你忘了定義一些你已經宣告過的變數,或者在某些地方被引用到的變數,那麼,聯結器linker是不知道這些引用該連線到那塊記憶體上的。然後就會報missing symbols 這樣的錯誤。如果你定義變數超過一次,聯結器是不知道把引用和哪塊記憶體連線,然後就會報 duplicated symbols這樣的錯誤了。
另外結構定義也是一種型別定義。
型別定義本身相當於宣告。
C語言中宣告與定義的區別
定義和宣告判斷 a int i 定義 b extern int i 宣告 定義 定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。乙個變數或物件在一定的區 域內 比如函式內,全域性等 只能被定義一次,如果定義多次,編譯器會提示你重複...
C語言中的宣告與定義的差別
1 對於以下的宣告語句 int a 假設其位置出如今全部的函式體之外,那麼它就被稱為外部物件a的定義。這個語句說明了a是乙個外部整型變數,同一時候為a分配了儲存空間。由於外部物件a並沒有被明白指定不論什麼初始值,所以它的初始值默覺得0 某些系統中的聯結器對以其它語言編寫的程式並不保證這一點,c編譯器...
C語言中的定義和宣告
定義 指的是在 中定義乙個變數 函式,定義的最顯著的乙個特徵是,執行定義後,編譯器會在記憶體中分配一塊記憶體給所定義的變數或函式,如執行int a b,c 0 都會在記憶體中分配一定的空間以存放這幾個變數。宣告 宣告的目的是在於告訴編譯器,系統中已經有這麼乙個名字是aaa的變數或者函式了,我要用的就...