C語言儲存方式和作用域 2 關鍵字的使用

2021-08-20 12:01:35 字數 2504 閱讀 9037

前面總結了變數的型別,不同型別的變數有著不同的儲存型別、不同的生命週期、不同的作用域.

在c語言中沒有其他高階語言的public private等修飾符,來限定變數和函式的有效範圍,但是卻有兩個類似的關鍵字能達到類似的效果:

extern 和 static.

先理解兩個概念:

1.外部函式:如果在當前檔案中定義的函式允許其他檔案訪問、呼叫,就稱為外部函式.(注意:c語言規定,不允許有同名的外部函式).

2.內部函式:如果在當前檔案中定義的函式不允許其他檔案訪問、呼叫,只能在內部使用,就稱為內部函式。(c語言規定不同的原始檔可以有同名的內部函式,並且互不干擾)

開始使用:

注意:如果乙個程式中有多個原始檔(.c),編譯成功會生成對應的多個目標檔案(.obj),這些目標檔案還不能單獨執行,因為這些目標檔案之間

可能會有關聯,比如a.obj可能會呼叫b.obj中定義的乙個函式。將這些相關聯的目標檔案鏈結在一起後才能生成可執行檔案。

比如:第一步建立one.c程式(源程式)

第二步main應該怎麼呼叫呢?

如果直接呼叫one()函式會報錯.    但是在xcode中,不會報錯,丟擲警告,但是在標準的c語言編譯器中,一定會報錯。

那麼就直接匯入#include"one.h"行了唄。

因為在鏈結的時候會報錯。我們已經在one.c中定義了one函式,現在又在main.c中定義one函式(從one.c那裡

拷貝one檔案內容

),c語言規定不允許有同名的外部函式,鏈結的時候鏈結器會發現在one.obj和main.obj中定義了同乙個函式,會直接報錯,xcode中的錯誤資訊是這樣的:

duplicate symbol _one是說one這個識別符號重複了,    linker是指鏈結器。

上面的兩種想法都是不可行的,其實思路是一致的。

要想讓main函式知道one函式的存在。

正確的做法應該是在main函式前面對one函式

進行提前宣告

(看清楚,是宣告,不是定義,定義和宣告是兩碼事)。

extern關鍵字對函式的作用:用來定義和宣告乙個外部函式,但是extern又跟auto一樣,完全可以省略。於是,我們可以簡化成上面這樣。

如果你覺得標準點 可以 在void 前面加上extern.

現在可以正確呼叫了:

為了模組化地開發,我們會把

one函式的宣告

寫到另乙個標頭檔案中。

當然檔名最好有意義,所以叫one.h,方便識別,

在這.h檔案中記得要進行巨集定義判斷防止多次拷貝

。以後誰想呼叫這個one函式,就匯入one.h標頭檔案就行了(xcode會預設幫忙建立這個one.h檔案...並且xcode 會自動生成巨集定義判斷防止多次拷貝,只需要宣告函式)

要是改為把onc.c檔案函式改為內部函式:

直接給出報錯,外部檔案不能訪問其他檔案內部函式.

#includestatic void test();

int main()

static void test()

1.extern:在定義函式時,如果在函式最左邊加上關鍵字 extern,則表示此函式是顯性的外部函式,可以供其他檔案呼叫。如果定義函式省略extern,則表示隱性的外部函式.

在乙個檔案中要呼叫其他檔案中的外部函式,則需要在當前檔案中用extern宣告該外部函式,然後可以呼叫。可以省略extern。

2.static:在定義函式時,在函式的最左邊加上static可以把該函式宣告為內部函式(又叫靜態函式),這樣該函式就只能在其定義所在的檔案中使用。如果在不同的檔案中有同名的內部函式,則互不干擾。

C語言變數作用域 static關鍵字

全域性變數 1 在所有函式外部定義的變數都是全域性變數,作用域在整個程式都有效 所以全域性變數一般都定義在標頭檔案中 2 全域性變數有預設值,即系統會自動對其初始化 整型 0 浮點型 0.0 字元型 0 空字元 指標 null 3 全域性變數儲存在記憶體的全域性區,占用靜態的儲存單元,所以其作用域是...

預解釋 作用域和this關鍵字

在js 執行之前,首先會在當前作用域下將所有帶var和function關鍵字的進行提前宣告 declare 或者定義 defined 引用資料型別開闢的空間 作用域 叫做堆記憶體 預解釋的7步驟 注意 在私有作用域下,預解釋的變數和定義的形參變數都是私有變數,在函式體中,我們遇到乙個變數首先看一下是...

C語言const關鍵字作用

c語言中const代表著 不可變 基本和常量一樣不可修改,但是應用場景不一樣。一.應用在變數 const char a a a b 錯誤,變數a的值不可以修改。此時代表變數a值不可改變,任何企圖修改a變數值的語句 例如a 20 都會報錯。二.應用在指標 1 應用在 左邊 const char p c...