1. 程式人生 > >stm32f103學習筆記——關鍵字extern、static、const

stm32f103學習筆記——關鍵字extern、static、const

1、extern

extern放在變數和函式宣告之前,表示該變數或者函式在別的檔案中已經定義,提示編譯器在編譯時要從別的檔案中尋找。除此之外,extern還可以用來進行連結指定。

(1) 宣告外部變數。在宣告全域性變數時,不同的檔案在編譯器編譯時是不透明的,在A.c中定義 int i,同時在B.c中定義 int i,編譯器編輯時是不會報錯的,但是當連結linking...時會報錯重複定義,連結是不同檔案是透明的,因此在定義全域性變數是不能夠重複定義。當需要使用同一個全域性變數時,如:在A.c中定義了int i,在B.c中需要呼叫i,只需要在B.c中宣告extern int i,表示該變數在別的檔案中已經定義,編譯時便不會出錯,在

linking...的時候會自動去查詢定義過的變數i

(2) extern函式宣告。Extern void fun() 暗示該函式可能在別的檔案中定義過,它和定義為void fun(),沒什麼區別,其用處在於在複雜的專案用通過在函式前新增extern宣告來取代利用include”*.h”來宣告函式。

(3) 單方面修改函式原型。(對於這個功能我沒怎麼看懂,只說說自己理解,原文請參考:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html)。 當宣告extern void fun(int i, int jint k)時,在之後的呼叫中如果按照是

fun(x,y,z)的原型呼叫時是沒有問題的,但是如果要對該函式進行修改比如減少輸入引數,呼叫時為fun(x,y)此時編譯器就會報錯了,解決方法就是去掉extern,該標頭檔案中宣告void fun(int i,int j),並對該函式進行修改,之後在呼叫的檔案中包含該函式所在的標頭檔案”*.h”即可。

(4) extern “C”。主要應用於C++環境下使用C函式,C++語言在編譯的時候為了解決函式的多型問題,會將函式名和引數聯合起來生成一箇中間的函式名稱,而C語言則不會,因此會造成連結時找不到對應函式的情況,此時C函式就需要用extern C”進行連結指定,這告訴編譯器,請保持我的名稱,不要給我生成用於連結的中間

函式名。

2、static

staticC++中的應用:面向過程程式設計、面向物件程式設計。

    面向過程程式設計:

(1) 應用於普通變數和函式,不涉及類。當在變數前加上static如:static int a,定義了a為全域性靜態變數,一般全域性靜態變數不定義在標頭檔案中,而是定義在原始檔中,全域性靜態變數只對所在原始檔透明,而在該檔案之外是不可見的。在定義全域性靜態變數的時候宣告和定義同時發生,即定義了static int a時就在全域性變數資料區分配了記憶體,如果為給a賦值,則程式自動初始化為0(在函式體內宣告的自動變數的值是隨機的,除非它被顯式初始化,而在函式體外被宣告的自動變數也會被初始化為0)

(2) 定義靜態變數的好處:在其他檔案中不會被引用;在不同的檔案中可以出現相同的變數名。

(3) 通常,在函式體內定義了一個變數,每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。

但有時候我們需要在兩次呼叫之間對變數的值進行儲存。通常的想法是定義一個全域性變數來實現。但這樣一來,變數已經不再屬於函式本身了,不再僅受函式的控制,給程式的維護帶來不便。

靜態區域性變數正好可以解決這個問題。靜態區域性變數儲存在全域性資料區,而不是儲存在棧中,每次的值保持到下一次呼叫,直到下次賦新值。

靜態區域性變數有以下特點:

該變數在全域性資料區分配記憶體;

靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;

靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0

它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。

(4) 靜態函式。在函式前新增關鍵字static,表示該函式為靜態函式,只對當前檔案可見,對其他檔案不可見。這樣也可以在同一個專案中不同的檔案定義相同的函式名,而不會出現錯誤。

面向物件程式設計:

(待續......)

C語言中的應用:

   (1) 用於定義內部函式:static <函式型別>  <函式名表示該函式只對該檔案可見,對其他檔案不可見。

   (2) 宣告全域性靜態變數:static <變數型別>  <變數名> static修飾的全域性變數宣告與定義同時進行,也就是說當你在標頭檔案中使用static聲明瞭全域性變數後,它也同時被定義了;最後,static修飾全域性變數的作用域只能是本身的編譯單元,也就是說它的全域性只對本編譯單元有效,其他編譯單元則看不到它 。

(個人認為:在c語言中的應用和在c++中面向過程程式設計的應用是一樣的,本身C語言就是一種面向過程程式設計的語言。)

3、const

常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。 同巨集定義一樣,可以做到不變則已,一變都變。可以節省空間,避免不必要的記憶體分配。const可以被extern修飾,但是static是不可以被extern修飾。