很久沒接觸c語言了,今天遇到宣告與定義的問題,於是找到下面的解釋:
宣告(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語言宣告的優先順序 a 宣告從它的名字開始讀取,然後按照優先順序順序依次讀取。b 優先順序從高到底依次是 b1 宣告中被括號括起來的那部分 b2 字尾操作符 括...
C語言宣告
怎樣定義和宣告全域性變數和函式最好。首先,儘管乙個全域性變數或函式可以有多處宣告但是定義卻最多隻允許出現一次,對於全域性變數,定義是真正分配空間並賦初值的宣告,對於函式,定義是提供函式體的宣告。例如 這些是宣告 extern int i extern int f 而這些是定義 int i 1 int...
C語言 宣告
1 首先著眼於識別符號 變數名或者函式名 2 從距離識別符號最近的地方開始,依照優先順序解釋派生型別 指標,陣列和函式 優先順序如下 1 用於整理宣告內容的括弧 2 用於表示陣列的,用於表示函式的 3 用於表示指標的 例如int func p double func p是指向返回int型別的函式的指...