當前位置:首頁 » 服務存儲 » extern用於修飾變數的存儲屬性
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

extern用於修飾變數的存儲屬性

發布時間: 2022-03-08 06:10:17

⑴ extern修飾的外部變數可以隨意改變其值嗎

可以改變。定義為全局變數。

⑵ 局部變數、全局變數、外部變數個採用什麼存儲方式

局部變數是指在函數內部,臨時申請的內存空間,函數執行完成後就自動被釋放掉,也在程序RAM空間;全局變數是指在函數外部聲稱的變數,程序執行過程中不會被釋放,程序未退出之前,一直在程序的RAM空間;外部變數,指的是不在本文件中聲稱的全局變數。

⑶ extern 聲明的變數 在內存的哪個位置數據段、.bss、堆、棧

定義的地方通常在不帶extern的地方,如果有初始值就存在數據段,未初始化存bss段

⑷ 用extern修飾的變數外部調用可以改變其值嗎

應該可以吧,試試不就知道了。。

c語言extern

extern是全局變數聲明
只要聲明全局變數就默認 前面加extern(程序員可以不加,但編譯器默認加上)

若本文件 引用別的文件中的全局變數 一定要加上extern 聲明一下

例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中聲明了的一個全局變數

這個extern 是個聲明他可以在任何地方聲明 引用了一個全局變數 (可以試試 在main()函數執行完之後聲明 也不會出錯)

這樣在 工程的總頭文件中就不需要考慮 先#include 哪個文件了

⑹ C語言中變數存儲static和extern兩個關鍵字的作用分別是什麼

在C語言中,static可以用來修飾局部變數,全局變數以及函數。在不同的情況下static的作用不盡相同。

(1)修飾局部變數

一般情況下,對於局部變數是存放在棧區的,並且局部變數的生命周期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態數據區,其生命周期一直持續到整個程序執行結束。但是在這里要注意的是,雖然用static對局部變數進行修飾過後,其生命周期以及存儲空間發生了變化,但是其作用域並沒有改變,其仍然是一個局部變數,作用域僅限於該語句塊。

在用static修飾局部變數後,該變數只在初次運行時進行初始化工作,且只進行一次。

如:

程序執行結果為: 2

3

說明在第二次調用fun()函數時,a的值為2,並且沒有進行初始化賦值,直接進行自增運算,所以得到的結果為3.

對於靜態局部變數如果沒有進行初始化的話,對於整形變數系統會自動對其賦值為0,對於字元數組,會自動賦值為''.

(2)修飾全局變數

對於一個全局變數,它既可以在本源文件中被訪問到,也可以在同一個工程的其它源文件中被訪問(只需用extern進行聲明即可)。

如:

有file1.c

int a=1;

file2.c

#include<stdio.h>

extern int a;

int main(void)

{

printf("%d",a);

return 0;

}

則執行結果為 1

但是如果在file1.c中把int a=1改為static int a=1;

那麼在file2.c是無法訪問到變數a的。原因在於用static對全局變數進行修飾改變了其作用域的范圍,由原來的整個工程可見變為本源文件可見。

(3)修飾函數

用static修飾函數的話,情況與修飾全局變數大同小異,就是改變了函數的作用域。

extern關鍵字

在C語言中,修飾符extern用在變數或者函數的聲明前,用來說明「此變數/函數是在別處定義的,要在此處引用」。
在上面的例子中可以看出,在file2中如果想調用file1中的變數a,只須用extern進行聲明即可調用a,這就是extern的作用。在這里要注意extern聲明的位置對其作用域也有關系,如果是在main函數中進行聲明的,則只能在main函數中調用,在其它函數中不能調用。其實要調用其它文件中的函數和變數,只需把該文件用#include包含進來即可,為啥要用extern?因為用extern會加速程序的編譯過程,這樣能節省時間。

⑺ 用extern修飾全局變數

輸出結果為:
5,25
5,15
分析:
1.運行從主程序開始,定義局部變數int x = 10, y = 5;經過a = x - y;b = x + y;後,此時a=5,b=15,暫時放內存中,轉頭執行f1函數了
2.f1函數中,重新定義局部變數int x = 15,y = 10;經過a = x - y;b = x + y;後,此時a=5,b=25,通過printf("%d,%d\n",a,b);輸出,結果為5,25
3.f1函數執行完後,主函數繼續前行printf("%d,%d\n",a,b);,輸出前面保存內存中的5,15,運行完成。

本程序中,extern int x,y;沒有發揮作用,因為c語言中明確規定,當外部全局變數與內部局部變數同名時,全局變數在局部變數的作用域內不發揮作用,所謂強龍不壓地頭蛇。

⑻ C語言中,extern 修飾函數是什麼意思

咯咯
是這樣的
如果你想定義一個靜態函數
要在函數返回值類型前加static
如果你想定義一個外部函數
要在函數返回值類型前加extern(可省略)
也就是說
默認為extern的

⑼ c++中的extern修飾符在變數的 聲明和定義方面有什麼作用

在C語言中,修飾符extern用在變數或者函數的聲明前,用來說明「此變數/函數是在別處定義的,要在此處引用」。

1. extern修飾變數的聲明。舉例來說,如果文件a.c需要引用b.c中變數int v,就可以在a.c中聲明extern int
v,然後就可以引用變數v。這里需要注意的是,被引用的變數v的鏈接屬性必須是外鏈接(external)的,也就是說a.c要引用到v,不只是取決於在
a.c中聲明extern int
v,還取決於變數v本身是能夠被引用到的。這涉及到c語言的另外一個話題--變數的作用域。能夠被其他模塊以extern修飾符引用到的變數通常是全局變
量。還有很重要的一點是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函數fun定義的開頭處聲明extern int

v,然後就可以引用到變數v了,只不過這樣只能在函數fun作用域中引用v罷了,這還是變數作用域的問題。對於這一點來說,很多人使用的時候都心存顧慮。
好像extern聲明只能用於文件作用域似的。

2.
extern修飾函數聲明。從本質上來講,變數和函數沒有區別。函數名是指向函數二進制塊開頭處的指針。如果文件a.c需要引用b.c中的函數,比如在
b.c中原型是int fun(int mu),那麼就可以在a.c中聲明extern int fun(int
mu),然後就能使用fun來做任何事情。就像變數的聲明一樣,extern int fun(int
mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范圍中。對其他模塊中函數的引用,最常用的方法是包含這些函數聲明的頭文件。使用
extern和包含頭文件來引用函數有什麼區別呢?extern的引用方式比包含頭文件要簡潔得多!extern的使用方法是直接了當的,想引用哪個函數
就用extern聲明哪個函數。這大概是KISS原則的一種體現吧!這樣做的一個明顯的好處是,會加速程序的編譯(確切的說是預處理)的過程,節省時間。在大型C程序編譯過程中,這種差異是非常明顯的。

3. 此外,extern修飾符可用於指示C或者C++函數的調用規范。比如在C++中調用C庫函數,就需要在C++程序中用extern 「C」聲明要引用的函數(只有C++才有extern 「C」的用法,在C中這樣用會報錯)。這是給鏈接器用的,告訴鏈接器在鏈接的時候用C函數規范來鏈接。主要原因是C++和C程序編譯完成後在目標代碼中命名規則不同。

4.對於extern變數來說,僅僅是一個變數的聲明,其並不是在定義分配內存空間。如果該變數定義多次,會有連接錯誤。extern用在變數聲明中常常有這樣一個作用,你在*.c文件中定義了一個全局的變數,這個全局的變數如果要被引用,就放在*.h中並用extern來聲明。

5.extern是C/C++語言中表明函數和全局變數作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變數可以在本模塊或其它模塊中使用。通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變數以關鍵字extern聲明。也就是說c文件裡面定義函數和變數,如果該函數或者變數欲開放給外部文件,則在h文件中用extern加以聲明。則外部文件只需include該h文件就可以了。而且編譯階段,外部文件是找不到該函數或者變數的,但是不報錯。link階段會從原先模塊生成的目標代碼中找到此函數和變數。

6.函數的聲明默認是extern的,如果函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件里定義,沒有其它作用。即下述兩個函數聲明沒有明顯區別:

extern int f(); 和int f(); 當然,這樣的用處還是有的,就是在程序中取代include 「*.h」來聲明函數,在一些復雜的項目中,在所有的函數聲明前添加extern修飾是一種比較好的習慣。

如果定義函數的c/cpp文件在對應的頭文件中聲明了定義的函數,那麼在其他c/cpp文件中要使用這些函數,只需要包含這個頭文件即可。

如果你不想包含頭文件,那麼在c/cpp中聲明該函數。一般來說,聲明定義在本文件的函數不用「extern」,聲明定義在其他文件中的函數用
「extern」,這樣在本文件中調用別的文件定義的函數時就不用包含頭文件 include 「*.h」來聲明函數,聲明後直接使用即可。

7.如果在模塊A中函數聲明了foo(int x,int y)為extern "C"類型,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數;反之亦然。

⑽ c++中類可以用關鍵字extern修飾嗎供其他文件使用嗎

extern是用來修飾變數的,不是用來修飾「類型」的。
別的文件需要使用你設計的類,直接包括那個類的頭文件即可。