c語言符號定義 宣告 引用 作用域及生命期 優化

2021-08-01 13:18:18 字數 1307 閱讀 7726

1、變數

全域性變數:不用考慮初始化問題,若未被初始化,則編譯器自動設定為0;

區域性變數:儲存在記憶體的堆疊中,若未被初始化則使用其占用記憶體空間原有的值,這個值是個隨機值,不初始化直接引用很危險。

2、定義及宣告

乙個函式只能(也必須)在乙個原始檔裡被定義,但是可以在其它多個原始檔裡被宣告。定義引起儲存分配,是真正產生那個實體。而宣告並不引起儲存分配。打乙個粗俗的比方:在原始檔a中定義,在原始檔

b中宣告,好比在

b裡開了一扇窗,讓它可以看到

a裡的那個函式。

宣告表示告訴編譯器該變數的存在,但是不為該變數分配儲存空間(int a;);而在定義變數時不僅告訴編譯器該變數存在,而且為該變數賦值,由於賦值了,所以變數的儲存空間就被分配了(int a=1;)。

當變數的作用域範圍內只有宣告,沒有定義時,編譯器會自動將第1個宣告當作是變數的定義。例如:

int f(int a)

c語言中的符號解析規則:

1)、不允許有多個符號(變數或函式)的定義;

2)、如果有乙個符號的定義和多個符號的宣告,則選擇被定義的符號;

3)、如果有多個符號的宣告,則從中任選乙個作為符號的定義;

3、引用

如果定義函式的c/cpp檔案在對應的標頭檔案中宣告了定義的函式,那麼在其他c/cpp檔案中要使用這些函式,只需要包含這個標頭檔案即可。

如果不想包含標頭檔案,那麼需要在其他c/cpp中宣告該函式。一般來說,宣告定義在本檔案的函式不用「extern」,宣告定義在其他檔案中的函式用「extern」,這樣在本檔案中呼叫別的檔案定義的函式就不用包含標頭檔案。

4、作用域及生命期

全域性變數:定義在函式外部,生命期整個程式;

區域性變數:定義區域性變數的函式或復合語句內,呼叫結束後生命期就結束;

static 全域性變數:生命期不變(整個程式執行過程一直存在),作用域減小(只在本檔案函式中可以引用);

static 區域性變數:生命期增加(整個程式執行過程一直存在),作用域不變;

5、函式有關優化

1)訪問內存在計算機的操作中很消耗時間,而每次呼叫函式都需要大量的時間來訪問記憶體,因此在程式的執行過程中儘量減少函式呼叫,將執行結果相同的函式合併;

2)全域性變數儲存在資料段上也就是儲存在記憶體中,區域性變數儲存在堆疊上。對於在程式中呼叫頻率高的區域性變數,編譯器會自動將其儲存在暫存器,但是全域性變數不會儲存在暫存器中,全域性變數在整個程式執行過程中一直存在,那麼在整個程式執行過程中,該暫存器都將無法儲存臨時變數或中間值,這對於暫存器資源稀少的計算機是不可接受的,程式執行效率會大打折扣。而訪問記憶體的時間要遠遠大於cpu的計算時間,因此要較少記憶體訪問,不要將使用頻率高的變數設定為全域性變數。

C語言巨集定義中的 , , 及 符號的作用

c語言巨集定義中的 及 符號的作用 1 stringizing 字串化操作符 作用 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input stri...

C語言巨集定義中的 , , 及 符號的作用

作用 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input string is t s n instr define example1 instr...

c語言向自定陣列 C語言陣列的定義及引用

c語言陣列的定義及引用 1.1 一維陣列的定義 初始化和引用 1.一維陣列的定義方式為 型別說明符 陣列名 常量表示式 1 陣列名的命名方法與變數名相同,遵循識別符號命名規則 2 陣列是用方括號括起來的常量表示式,不能用圓括號 3 常量表示式表示陣列元素的個數,即陣列的長度,陣列的下標從0開始,下標...