宣告和定義

2021-08-09 11:00:29 字數 1600 閱讀 6519

宣告就是指給除了當前變數或者函式,或者類什麼的名字,不給其中的內容,就是先告訴你有這樣乙個什麼型別的變數或者函式,但是這個變數或者函式的具體資訊卻是不知道的。就好比跟你介紹乙個人的時候,宣告就是只告訴你這個人叫什麼,但是缺不給你說這個人到底怎麼樣,他有哪些優點,缺點,喜好問題是什麼的。

定義就不一樣了,定義直接告訴你了所有的東西,這個變數是什麼,這個函式是什麼功能,這個類裡面包含了什麼東西。很具體的說明。

int a;  // 這樣屬於宣告,並沒有給a定義他的值為多少,因此他可能是任意值,如果後面直接使用會有意想不到的後果

int a = 3;  // 這樣屬於宣告int型別變數a,並定義為3。

宣告(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階段唯一正確地對應一塊記憶體,這樣的操作是為定義。

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

extern用法:

(1)

extern"c"/"c++"

void fun(){}//告訴編譯器以c方式或是以c++的方式編譯

(2)函式宣告可以不用extern

extern int a;//宣告a;

宣告和定義

宣告 向計算機介紹名字,它說,這個名字是什麼意思 而 定義 為這個名字分配 儲存空間。無論涉及到變數時還是函式時含義都一樣。無論在哪種情況下,編譯器都在 定義 處分配儲存空間。對於變數,編譯器確定這個變數佔多少儲存單元,並在記憶體中產生存放它們 的空間。對於函式,編譯器產生 並為之分配儲存空間。函式...

宣告和定義

在宣告部分出現變數有兩種情況 1 一種是需要建立儲存空間的,如 int a 2 另一種是不要建立儲存空間的,如 extern int a 前者是 定義性宣告 defining declaration 或者稱為 定義 definition 後者是 引用性宣告 referencing declarati...

宣告和定義

宣告 函式或變數會在某處出現,在此處,該函式或變數長這樣。定義 這就是這個函式或者變數。定義處,為函式或變數分配儲存空間。乙個變數或函式,只能有乙個定義。one definition rule.定義也可以是宣告。如果乙個變數或者函式有多個檔案要用,可以用extern.extern 的原理很簡單,就是...