C 的宣告和定義與記憶體

2021-10-02 13:25:05 字數 853 閱讀 8160

以前在上學的時候,沒有仔細的看過這個點,一直認為宣告、定義差不多,也沒有深入的思考。這次重新鞏固的時候,我發現本身這三個點在不同的型別的情況下表現的差別很大。先把最終的結果寫上:

區域性變數:宣告和定義在呼叫的時候同時進行記憶體分配。

全域性變數:宣告的時候不分配記憶體,定義的時候分配記憶體(注意,此處的全域性變數是指多個檔案呼叫,使用extern宣告的。如果只單個檔案呼叫,還是區域性變數一樣)。

函式:宣告和定義的時候不分配記憶體,呼叫的時候分配記憶體。

結構體:宣告和定義的時候不分配記憶體,例項化的時候分配記憶體。

類:宣告和定義的時候不分配記憶體,例項化的時候分配記憶體。

我們常見的是區域性變數的方式:

int a = 1;
這樣其實是把宣告和定義一起做了,我也一直以為其他的變數都差不多,但是其實想想都不對的。我們使用系統的變數,就好像使用已經弄好的工具一樣,當然直接拿來用就好了。但是如果是我們自己宣告並且定義的變數比如:函式、類、結構體。這種就是新的工具了,肯定要告訴別人:我先把這個工具準備好,但是我不用,等我需要的時候再用。這就是先宣告和定義好了。然後待例項化或者呼叫的時候才用的例子。所以這裡就會引出靜態成員變數,為什麼要在類外初始化了。在宣告的時候,沒有記憶體,但是在例項化的時候靜態的大家要一起用。所以沒有辦法,一定要在類外去初始化一下。否則在多執行緒的時候就會出現很多的問題,乾脆先把初始化這個事情做了吧。

不知道為什麼,我總覺得在類外初始化這種設計缺乏美感,感覺是c++在設計的時候一種無奈之舉。因為這個操作確實很令人費解。

好了,今天就到這裡吧。

C 宣告與定義

一般解釋來說 宣告是告訴編譯器存在這麼乙個識別符號。定義則是為程式申請一塊記憶體。下面舉例說下需要注意的事項。a.如果宣告有初始化式,就被當作定義,即使前面加了extern。只有當extern宣告位於函式外部時,才可以被初始化。例如 extern double pi 3.1416 定義 b.除非有e...

c 的宣告和定義

c 中,除了inline函式和符號常量之外,普通的物件和函式只能被定義一次,所以.h的標頭檔案就用來儲存物件和函式的宣告,而將定義儲存在乙個.cpp中,其它要使用該物件或函式的.cpp檔案就可以包含該.h標頭檔案。同時使用extern字首表示 該物件已經在別處被定義,這裡只是給編譯器乙個提示。同時,...

c 宣告和定義

標頭檔案中的 全域性 變數只能放宣告,不能定義 標頭檔案中的變數只能宣告,不能定義,否則其他多個.c檔案包含該標頭檔案,出現重複定義,導致鏈結出錯。ifndef define endif防止的是 重複編譯 而不是 重複定義 重複編譯可能造成重複定義,但重複定義的 不只有重複編譯 從 變成可執行的程式...