當前位置:首頁 » 編程語言 » c語言中函數默認儲存類型
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中函數默認儲存類型

發布時間: 2023-05-12 07:37:48

c語言中,函數的隱含存儲類別是 auto 還是 extern,為什麼兩種答案我都看到過

函數的存儲類型指的是其他文件模塊可否訪問,其類別可以是extern或static。

static是指該函數只能被本源程序文件道中的模塊訪問。extern是指可被本源程序文件外的模塊訪問。

C語言中函數的存儲類型隱含為版全局的,因此默認為extern。

函數內定義的變數,默權認作用域在本函數內,即其類型是auto。

(1)c語言中函數默認儲存類型擴展閱讀:

C語言中提供了存儲說明符auto、register、extern、static說明的四種存儲類別。四種存儲類別說明符有兩種存儲期:自動存儲期和靜態存儲期。

其中auto和register對應自動存儲期。具有自動存儲期的變數在進入聲明該變數的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。在函數內部定義的變數成為局部變數。在某些C語言教材中,局部變數稱為自動變數,這就與使用可選關鍵字auto定義局部變數這一作法保持一致。

extern用在變數聲明中常常有這樣一個作用:要在*.c文件中引用另一個文件中的一個全局的變數,那就應該放在*.h中用extern來聲明這個全局變數。

extern用於變數的用法:

1、extern int a;//聲明一個全局變數a

2、int a; //定義一個全局變數a

3、extern int a =0 ;//定義一個全局變數a 並給初值。一旦給予賦值,一定是定義,定義才會分配存儲空間。(注意:經過測試在GCC中,這樣定義變數是不能通過編譯的,而在VS2013可以)

Ⅱ 在函數中的默認的存儲類型說明符的變數是什麼存儲類型

1) 所有全局變數全部以g_開頭,並且盡可能聲明成static類型.
2) 盡量杜絕跨文件訪問全局變數.如果的確需要在多個文件內訪問同一變數,應該由該變數扮並州定義所在文件內提供GET/PUT函數實現.
3) 全局變數必須要有一個初始值,全局變數盡量放在一個專門的函數內初始化.
4) 如調用的函數少於三個,請考慮改為局部變數實現.

存儲類說明符:
Auto:只在塊內變數聲明中被允許, 表示變數具有本地生存期.
Extern:出現在頂層或塊的外部變數函數與變數聲明中,表示聲明的對象具有靜態生存期, 連接程序知道其 名字.
Static:可以放在函數與變數聲明中,在函數定廳蔽義時,只用於指定函數名,而不將函數導出到鏈接程序,在函數聲明中,表示其後邊會有定義聲明的函數,存儲類型static.在數據聲明中,總是表示定義的聲明不導出到連接程序.

1、函數
C語言中一個人為的規范:在.h文件中聲明的函數,如果在其對應的.c文件中有定義,那麼我們蔽遲在聲明這個函數時,不使用extern修飾符, 如果反之(在其.c中沒定義),則必須顯示使用extern修飾符.
所以在C語言的.h文件中,我們會看到兩種類型的函數聲明. 帶extern的,還不帶extern的, 簡單明了,一個是引用外部函數,一個是自己聲明並定義的函數.

2、全局變數.
全局變數的使用不可避免, 比如,在first.c中需要使用一個全局變數G_test, 那麼我們可以在first.h中,定義 TPYE G_test. 與對函數的使用類似, 在second.c中我們的開發人員發現他也需要使用這個全局變數, 而且要與first.c中一樣的那個, 如何處理? 對,我們可以仿照函數中的處理方法, 在second.h中再次聲明TPYE G_test, 根據extern的用法,以及c語言中默認的存儲類型, 在兩個頭文件中聲明的TPYE G_test,其實其存儲類型都是extern, 也就是說不必我們操心, 連接程序會幫助我們處理一切. 但我們又如何區分全局變數哪個是定義聲明,哪個是引用聲明呢?這個比函數要復雜一些, 一般在C語言中有如下幾種模型來區分:
a、初始化語句模型
頂層聲明中,存在初始化語句時,表示這個聲明是定義聲明,其他聲明是引用聲明。C語言的所有文件之中,只能有一個定義聲明。
按照這個模型,我們可以在first.h中定義如下TPYE G_test=1;那麼就確定在first中的是定義聲明,在其他的所有聲明都是引用聲明。
b、省略存儲類型說明
在這個模型中,所有引用聲明要顯示的包括存儲類extern,而每個外部變數的唯一定義聲明中省略存儲類說明符。
這個與我們對函數的處理方法類似,不再舉例說明。
http://hi..com/pepsi360/blog/item/07c92ba8764088baca130c37.html

Ⅲ C語言中函數是如何存儲的

1. 代碼本身是存儲在內存的代碼段中的,而函數沒有說存儲的概念,函數調用時是通過棧來實現的。
2.在函數體內聲明的變數在默認情況下都是auto存儲類型
在代碼塊之間傳遞信息的一種方法就是使用外部變數。當一個變數在函數的外部被聲明時,安的存儲空間是永久分配的,安人存儲類型是extren.外部變數的聲明看上去和函數或代碼塊內部所聲明的變數一樣。外部變數對於它之後的所有函數都有效。在代碼塊或函數後,外部變數仍然存在。
3.static的基本用途是允許一個局部變數在重新進入代碼塊時能夠保持原來的值。這和自動變數形成了鮮明的對比,自動變數在代碼塊時會被銷毀,再次進入這個代碼塊時,它必須重新進行初始化。
4.egister存儲類型告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。使用register存儲類型的目的一般是為了提高執行速度,但是,register聲明只是向編譯器所提出的「建議」,並非強制要求。

Ⅳ c語言中,函數的隱含存儲類別及形參的默認存儲類別分別是

c語言中,函數的隱含存儲類別是extern
形參的默認存儲類別是auto

Ⅳ C語言中允許默認的函數類型是什麼

int。C語言規定:在定義函數時,若其返回值類型為int,則可以默認。

C語言函數有三類,分為外部函數、靜態函數、內聯函數,其中前兩種是C89標准支持,第三種是C99標准增加的。

1、外部函數

這類函數是默認的函數類型,基本上平時我們使用的就是這種函數,聲明有以下兩種方式,例如:

// 使用extern關鍵字,顯示聲明

extern int add(int a, int b);

// 或省略關鍵字extern,編譯器也會自動認為是extern

int add(int a, int b);

外部函數表明在當前聲明和定義的代碼文件中可以使用,也可以在其它代碼文件中可以通過#include指令包含使用,對外部的代碼可見。

2、靜態函數

這類函數其實與外部函數相對的,因為需要使用static關鍵字修飾,因此稱為靜態函數,其實就是內部函數。聲明方式如下,例如:

static int add(int a, int b);

靜態函數的作用域只能在當前聲明和定義的文件中,在其它代碼文件中無法#include使用,因此在整個程序中,特別是大型程序,有多個源代碼文件時,即使定義相同名稱的兩個靜態函數,也不會有命名和使用沖突。

3、內聯函數

是新增的特性,使用inline關鍵字聲明和定義,該類函數類似#define宏定義展開,編譯時會直接將函數定義代碼在調用的地方復制展開,這樣會減少函數調用的開銷,提高運行效率。

inline int add(int a, int b);

內聯函數適合短小的、被頻繁調用的函數,對於復雜函數,無法使用。

(5)c語言中函數默認儲存類型擴展閱讀:

C語言編寫注意事項:

1、const在聲明變數中起限製作用, 該限定變數的值不能被修改。

2、%運算符不能應用與float或double類型。

3、char類型轉換為int型時, 無法判斷它是signed還是unsigned.這樣其結果有可能為負數, 因此轉換時盡量指定signed和unsigned限制符。

4、++i與i++不同之處: ++i是先+1在使用, i++是先使用i在遞加1。

5、三元運算符"?:" 第一個表達式的括弧不是必須的,但是由於三元表達式的優先順序非常低,我們還是將第一個表達式用()括起便於閱讀和理解。

6、C語言中可以使用遞歸 (即函數調用自身函數), 其不節省儲存器開銷也不加快執行速度, 只是使程序緊湊便於理解。

Ⅵ c語言宏定義存儲的什麼類型

宏定義存儲的類型有static 、auto、extern、及register,函數默認的存儲類型應該是extern,意思是具有外部鏈接性的。一般來說,會通過extern來聲明函數。

存儲具有如下特點:索引從 0 開始,數組在內存中占據連續的位元組單元。數組占據的位元組單元數等於數組元素個數乘以該數組所屬數據類型的數據占據的位元組單元數(元素個數乘以元素類型大小)。數組元素按順序連續存放。

宏定義格式:

#define 標識符,字元串。其中的標識符就是所謂的符號常量,也稱為「宏名」。

預處理(預編譯)工作也叫做宏展開:將宏名替換為字元串。掌握"宏"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,准確理解之前就要「換」。

Ⅶ 在C語言中,局部變數的存儲類別自動默認為( )

C語言,局部變數的存儲類別自動默認為
A,函數內部或語句組內部的局部變數默認是自動變數,即auto。

Ⅷ c語言中在函數中默認存儲類型說明符的變數是內部靜態變數,但我認為是自動存儲類型吧,求大神解釋一下

不知碧配道你說的默認是靜態變數是哪裡看的,只有明確晌帆帶有static聲明的變數才是靜態變數,沒有標志的全是局部變數,也就是你說的自動存儲類型,函宴慧雹數返回就不存在了.

Ⅸ C語言中有哪些存儲類型

Turbo C2.0支持四種變數存儲類型。說明符如下:
auto static extern register
下面分別來介紹。
一、auto
auto稱為自動變數。

局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進
行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上
從來不用。
局部變數在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這
個變數也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自
動消失。
二、static
static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1. 靜態局部變數
它與局部變數的區別在於: 在函數退出時, 這個變數始終存在, 但不能被其它
函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變數一樣。
2. 靜態全程變數
Turbo C2.0允許將大型程序分成若干獨立模塊文件分別編譯, 然後將所有模塊
的目標文件連接在一起, 從而提高編譯速度, 同時也便於軟體的管理和維護。靜態
全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它源文件使用,
而靜態全程變數卻不能再被說明為外部的, 即只能被所在的源文件使用。
三、extern
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外, 還要
被其它文件使用。因此, 必須將全程變數通知每一個程序模塊文件, 此時可用
extern來說明。
四、register
register稱為寄存器變數。它只能用於整型和字元型變數。定義符register說
明的變數被Turbo C2.0存儲在CPU的寄存器中, 而不是象普通的變數那樣存儲在內
存中, 這樣可以提高運算速度。但是Turbo C2.0隻允許同時定義兩個寄存器變數,
一旦超過兩個, 編譯程序會自動地將超過限制數目的寄存器變數當作非寄存器變數
來處理。因此, 寄存器變數常用在同一變數名頻繁出現的地方。
另外, 寄存器變數只適用於局部變數和函數的形式參數, 它屬於auto型變數,
因此, 不能用作全程變數。定義一個整型寄存器變數可寫成:
register int a;
對於以上所介紹的變數類型和變數存儲類型將會在以後的學習中, 通過例行程
序中的定義、使用來逐漸加深理解。

Ⅹ C語言中有哪些存儲類型

c語言中的存儲類型有auto, extern, register, static 這四種,存儲類型說明了該變數要在進程的哪一個段中分配內存空間,可以為變數分配內存存儲空間的有數據區、BBS區、棧區、堆區。

1. auto存儲類型
auto只能用來標識局部變數的存儲類型,對於局部變數,auto是默認的存儲類型,不需要顯示的指定。因此,auto標識的變數存儲在棧區中。
2. extern存儲類型
extern用來聲明在當前文件中引用在當前項目中的其它文件中定義的全局變數。如果全局變數未被初始化,那麼將被存在BBS區中,且在編譯時,自動將其值賦值為0,如果已經被初始化,那麼就被存在數據區中。全局變數,不管是否被初始化,其生命周期都是整個程序運行過程中,為了節省內存空間,在當前文件中使用extern來聲明其它文件中定義的全局變數時,就不會再為其分配內存空間。

3. register存儲類型
聲明為register的變數在由內存調入到CPU寄存器後,則常駐在CPU的寄存器中,因此訪問register變數將在很大程度上提高效率,因為省去了變數由內存調入到寄存器過程中的好幾個指令周期。

4. static存儲類型
被聲明為靜態類型的變數,無論是全局的還是局部的,都存儲在數據區中,其生命周期為整個程序,如果是靜態局部變數,其作用域為一對{}內,如果是靜態全局變數,其作用域為當前文件。靜態變數如果沒有被初始化,則自動初始化為0。靜態變數只能夠初始化一次。