c語言標頭檔案包含 全域性變數使用問題

時間 2022-02-01 19:38:48

1樓:_葉子妞妞

c語言在標頭檔案中包含全域性變數有三種形式:

1 在標頭檔案中宣告乙個全域性變數,在乙個c檔案中定義全域性變數,然後在所有的引用了這個標頭檔案的c檔案裡都可以使用該全域性變數值。

如在main.c定義

int a = 3;

然後定義乙個main.h,那麼所有引用main.h的c檔案中,均可以訪問a並更改其值。

2 在標頭檔案中定義乙個靜態全域性變數。那麼所有引用該標頭檔案的c檔案,均擁有乙個作用域在本檔案範圍內的同名靜態全域性變數。不同檔案中的該變數雖然同名,但卻是不同的變數。

比如在a.h中定義

static int a = 3;

那麼在a.c中引用a.h,並將a值修改為4。

在b.c中也引用a.h,不對a值做修改,列印a值,仍為3, 不會因為a.c中的修改而改變值。

3 在標頭檔案中定義全域性變數。該標頭檔案僅可以被乙個c檔案引用一次。

比如a.h中定義

int a = 3;

在a.c中可以引用a.h,並對a進行訪問和修改。

如果在同專案下有b.c引用了a.h,編譯器在鏈結時會報同名全域性變數的錯誤,導致編譯失敗。

2樓:哈妮寶貝

全域性變數在標頭檔案中只是乙個宣告,所以不能賦初值,只有真正定義的時候,才可以賦值,所以一般標頭檔案是extern int g; 這種寫法的

3樓:孟戈大猛

int g=3為顯示的賦值,很多編譯器容易出錯,應該先宣告 在賦值,int g;g=3;

a.h:

int g;

a.c:int g=3;兩次宣告,不能多次宣告統一變數,應該a.h:

int g;

a.c: g=3;

4樓:

.h標頭檔案中一般只做變數或者函式的宣告,而賦值一般放到.c檔案中,這樣就不會出錯了

5樓:匿名使用者

a.h:

int g=3;

b.c: #include"a.h"

#include

int main()

因為b.c中的

#include"a.h"相當於把a.h中的內容拷貝過來相當於b,c的內容是

int g=3;

#include

int main()

6樓:

我試過了 第一種個情況可以編譯通過 而且答案也是正確的

c語言 中 為什麼不將全域性變數的定義放在標頭檔案中

7樓:

首先要說明什麼是全域性變數,c語言中全域性變數一般是指定義在函式體外的變數。全域性變數按可訪問性可分為外部變數內部變數

內部變數是指使用了static關鍵字修飾的全域性變數,它的可訪問範圍(作用域)被限定在本原始檔所在的鏈結檔案模組中,不能被其它檔案模組引用。反之沒有被static關鍵字修飾的全域性變數則是外部變數,其它檔案模組可以通過extern關鍵字引用該全域性變數並訪問。

要說明的是全域性變數無論是內部變數還是外部變數,的儲存類別都是靜態的,也就是放到靜態記憶體區域中,它編譯鏈結階段就已經分配好了固定的記憶體。

搞清楚上面的內容,就很容易得出若把全域性變數放在標頭檔案會有哪些問題;

一 對內部變數來說,每個include該標頭檔案的檔案模組中都會單獨為這個內部變數分配靜態記憶體空間,這個空間是相對獨立的,是一種空間浪費,同時還失去了全域性變數訪問一致性的特點,實在沒有什麼意義。如果這個標頭檔案只被乙個模組使用,對於這個檔案模組來說應該沒啥問題。

二 對外部變數來講,這個標頭檔案被多個檔案模組include的情況下,鏈結過程會報錯,因為符號衝突,所有include這個標頭檔案的模組都會有這個全域性符號。在這個標頭檔案僅僅只被乙個模組include的時候可以正常使用。

經上分析得出要避免全域性變數定義在標頭檔案中,因為當這個標頭檔案被多方include的時候會產生一些不必要的麻煩,就這麼多。

全域性變數作用域範圍較廣,被錯誤修改後排查定位問題比較困難,若非必要盡少使用。

下面說一下比較好的方式就是全域性變數只定義在實現檔案(.c,.m)中,對內部變數沒啥說的它只在檔案模組內部使用,對外部變數可以在該模組標頭檔案中使用extern關鍵字修飾一下,這樣其它檔案模組只要直接include該標頭檔案就可以使用模組中的外部變數了。

8樓:首都有錢小少爺

因為你的標頭檔案可能會被多個c檔案包含,這樣一來多個c檔案中就會有同乙個全域性變數的定義(強符號),鏈結器就會不知道該使用哪個符號來鏈結從而出錯(重定義)。宣告會被認為是弱符號所以標頭檔案中一般只寫宣告。

9樓:王博好帥

一般情況下變數都不放在標頭檔案中,這樣做一是因為規定,二是因為:變數一般情況下都是再你編的程式中重新定義,也就是用到什麼定義什麼,用多少定義多少。希望對你有幫助。

我的q號是619100612.希望能幫到你。

10樓:匿名使用者

如果全域性變數放在標頭檔案裡面,那麼意味著它將不能初始化,否則多個編譯單元包含標頭檔案的時候將會出錯。不能初始化的話,多個編譯單元都能對其進行修改,這使程式可維護性變差。

11樓:以和為貴

標頭檔案中定義的是系統資料是公用的。全域性變數是要根據自己的需要進行定義的。二者不同。

12樓:

原因有二:

一、跟蹤難度大。如果工程小,跟蹤其變化沒有什麼難度,如果工程很大,包含這個標頭檔案的檔案都有可能修改其值,出了問題不好排查。

二、c主要還是用於嵌入式,與硬體有關。許多嵌入式系統的記憶體不想電腦那麼大,如果在標頭檔案中宣告全域性變數,那麼所有引用該標頭檔案的檔案都將為此變數非配記憶體,這樣降低了記憶體的利用率,有時幾k就是致命的。

13樓:匿名使用者

標頭檔案中一般都是函式庫和單元檔案,全域性變數就是在程式的最前頭!

14樓:鵠蟲

不便於及時修改操作。

c語言標頭檔案中定義全域性變數,多定義乙個就報錯,有人遇到同樣的狀況嗎?

15樓:肥醉瑞雅寧

有………………

重新建乙個結構體

再有就是全域性變數別定義那麼多

通過函式傳值

最後你程式肯定有錯

雖然編譯成功了不過肯定有地方不太對

在c語言中,乙個檔案中定義的 全域性變數,在另乙個檔案中能用嗎?

16樓:莫道無情

全域性變數extern可以

copy在其他源程式中使用;全域性變bai量dustatic只能在本程式中使用。zhi

全域性變數是使用相同的記憶體塊在整個dao類中儲存乙個值。

全域性變數既可以是某物件函式建立,也可以是在本程式任何地方建立。全域性變數是可以被本程式所有物件或函式引用。

17樓:

包含該全域性變數所在的標頭檔案,並在使用改變量的上方加入外部引用宣告: extern "變數名" 即可

18樓:time大叔vs蘿莉

定義乙個static全域性變數就可以了

19樓:請不要惦記我

你說的好像不對吧,

正確的解決辦法:使用extern關鍵字來宣告變數為外部變數。具體回說就是在其中答乙個c檔案中定義乙個全域性變數key,然後在另乙個要使用key這個變數的c檔案中使用extern關鍵字宣告一次,說明這個變數為外部變數,是在其他的c檔案中定義的全域性變數。

請注意我這裡的用詞:定義和宣告。例如在main.

c檔案中定義變數key,在common.c檔案中宣告key變數為外部變數,這樣這兩個檔案中就能共享這個變數key了。

(1)main.c檔案

#include "common.h"

unsigned char key;

(2)common.c檔案:

#include "common.h"

extern unsigned char key;

20樓:匿名使用者

能,只要預先宣告就可以了

21樓:d凌

全域性變數的有效範圍為從定義變數的位置開始到本原始檔結束。

c語言標頭檔案定義全域性變數問題

22樓:灩麗

1、首先,我們可以在函式外面定義變數,就是全域性變數。

2、區域性變數可以與全域性變數同樣命名。

3、但是優先順序是區域性變數優先。

4、但是區域性變數的生命週期是整個結構內。

5、全域性變數是整個程式結束,才釋放。

6、我們也可以為變數加上修飾符。

23樓:吉祥二進位制

一般來說,不會將全域性變數的定義寫在標頭檔案中,因為如果多個c原始檔都新增了標頭檔案,那很容易引起重定義的問題,這時候一般編譯器都會提示。

正確的作法是在c原始檔中定義乙個全域性變數。在標頭檔案中加入全域性變數的宣告。比如

//var.c 乙個主要用於定義全域性變數的c原始檔int g_a;

char g_x;

//var.h 用於宣告定義的全域性變數

extern int  g_a;

extern char g_x;

//test.c 乙個用於測試的標頭檔案

#include

void f()

24樓:匿名使用者

你得理解:

我們把.c和.h分開是為什麼

連線做的事情就是把.c和.h又合在一起,不僅如此,還把abc都合在一起(而你的條件編譯指令僅限於第乙個階段起作用!

);於是包含了int a宣告的a.o、b.o和c.

o在合成xx.out的時候,就有3次int a宣告;

通常正確的做法是:把」變數/函式宣告「放在.h,而把」變數/函式定義「放在.

c;那麼你的這句int a是宣告還是定義?從錯誤提示「。。。already defined。。。

」可以看出鏈結工具把它識別為「定義」而不是「宣告」。函式宣告不會有這種問題,而變數的宣告和定義(尤其在不帶初始化的情況下)就長的一模一樣。所以我的建議是,你不要糾結這個問題了,把這句int a放在a.

c裡面,然後去b.h和c.h裡面宣告extern int a(還要囉嗦一句,變數不要用乙個字母a就概括了);

希望對你有幫助

c語言中關於全域性變數的使用問題

25樓:匿名使用者

在file1.c中能定義全域性變數嗎?好像要把全域性變數定義在stdafx.cpp中,然後在file2.c中extern....

26樓:匿名使用者

是的 要求file1.c跟file2.c屬於同乙個專案

c語言,全域性變數,關於標頭檔案包含的問題

27樓:金魚

c語言在標頭檔案中包含全域性變數有三種形式:

1 、在標頭檔案中宣告乙個全域性變數,在乙個c檔案中定義全域性變數,然後在所有的引用了這個標頭檔案的c檔案裡都可以使用該全域性變數值。

如在main.c定義

int a = 3;

然後定義乙個main.h,那麼所有引用main.h的c檔案中,均可以訪問a並更改其值。

2 、在標頭檔案中定義乙個靜態全域性變數。那麼所有引用該標頭檔案的c檔案,均擁有乙個作用域在本檔案範圍內的同名靜態全域性變數。不同檔案中的該變數雖然同名,但卻是不同的變數。

比如在a.h中定義

static int a = 3;

那麼在a.c中引用a.h,並將a值修改為4。

在b.c中也引用a.h,不對a值做修改,列印a值,仍為3, 不會因為a.c中的修改而改變值。

3 、在標頭檔案中定義全域性變數。該標頭檔案僅可以被乙個c檔案引用一次。

比如a.h中定義

int a = 3;

在a.c中可以引用a.h,並對a進行訪問和修改。

如果在同專案下有b.c引用了a.h,編譯器在鏈結時會報同名全域性變數的錯誤,導致編譯失敗。

c語言中,全域性變數和外部變數有什麼區別

外部變數也是全域性變數,被定義成外部變數是指這個變數沒有在當前 中,而是在另乙個 或二進位制檔案中。比如我在a.c中定義了變數myvar,還有乙個檔案b.c,它要用a.c中的myvar,這就要讓b.c知道myvar怎麼定義的,有兩種方法,一種是include a.c,但一般不這麼做 還有一種方法是在...

C語言中,全域性變數和外部變數有什麼區別

舉個生動的例子 全域性變數就像你們這棟樓 樓道裡的垃圾桶 外部變數相當於其他樓裡的垃圾桶 全域性變數的作用域是當前整個檔案 其他檔案要使用它,應該用extern來宣告它此時對於要用它的檔案來說,它就變成了外部變數了。全域性變數也稱為外部變數,它是在函式外部定義的變數。它不屬於哪乙個函式,它屬於乙個源...

C 中使用全域性變數好,還是public的類成員變數好

1 c 杜絕全域性變數。2 c 也不建議把成員變數設定為public。而且簡單的pubic設定和全域性化也沒有任何關聯,估計你想要的是static的public變數 不知道你為什麼會有這類問題,c 看待角度應該和c有截然不同的視角,不要用c的想法去套c 我無法估計你要什麼,我只能估計給個建議 1 如...