關於C標頭檔案嗎中定義或宣告變數的問題

2021-08-28 02:43:52 字數 1061 閱讀 5967

1.謹記一點,#include只是標頭檔案內容在此處的文字展開

2.c語言檔案全域性區的變數是若非static宣告,實在其他同目錄下的檔案內可見的。

假設標頭檔案中有:int a;

此時若有兩個檔案同時包含了標頭檔案,則會在兩個檔案中都定義了a,所以重定義,可在標頭檔案中int a 前加static避免;

此時標頭檔案宣告,只是說明全域性區個變數a,僅僅乙個,不會出錯。但此時不可在包含標頭檔案的檔案中再定義a,不然又是重定義。只能使用,但是**的全域性區只能宣告或定義,不能賦值。所以改變a的值只能在函式內。

static變數

.全域性變數(外部變數)的說明之前再冠以 static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

從以上分析可以看出,把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。

static 函式

static 函式與普通函式作用域不同。僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案

1.static 全域性變數與普通的全域性變數有什麼區別:static 全域性變數只初使化一次,防止在其他檔案單元中被引用;

2.static 區域性變數和普通區域性變數有什麼區別:static 區域性變數只被初始化一次,下一次依據上一次結果值;

3.static 函式與普通函式有什麼區別:static 函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝

標頭檔案中定義變數

在標頭檔案中定義了乙個變數,若另乙個檔案再 int 變數名 則會再產生乙個相同變數的定義,在linux環境中編譯時會發生如 menu.o sbss 0x0 multiple definition of is refresh living time thread created main.o sbss...

const變數定義於標頭檔案中

一。首先要知道強弱符號 編譯器編譯原始檔時會把原始檔的全域性符號 global symbol 分成強 strong 和弱 weak 兩類傳給彙編器,而隨後彙編器則將強弱資訊編碼並儲存在目標檔案的符號表中。那麼何謂強弱呢?編譯器認為函式與初始化了的全域性變數都是強符號,而未初始化的全域性變數則成了弱符...

關於標頭檔案中定義的全域性變數的包含

在標頭檔案中定義了乙個變數,若另乙個檔案包含此檔案則會再產生乙個相同變數的定義,在linux環境中編譯時會發生如 menu.o sbss 0x0 multiple definition of is refresh living time thread created main.o sbss 0x0 ...