static變數放在標頭檔案的後果

2021-07-06 07:18:47 字數 1333 閱讀 2388

問題:想用

static tlist* g_*** =null;

當全域性變數存煉表頭,但是可能在多處使用該全域性變數,listgethead()之類的引數用,所以就打算把static變數暴露出去,放在標頭檔案。

最後出現了乙個問題,那就是往煉表存東西,當時用listgethead和listgetnext之類的傳全域性變數都能傳,到想用它時候從別處使用,g_***仍然為null。

這種定義方式是否叫全域性變數

後來想到,標頭檔案,是不是每個原始檔引用這個標頭檔案都是單獨計算的?也就是假設互不相干,雖然在同乙個工程下,但是畢竟還是要編譯的,要分析原理。

假設a.c和b.c都引用a.h定義的變數,也可以等價看成a.c和a.h編譯一次,b.c和a.h編譯一次,他們是分開的。做個小實驗

main和a都引用了a.h,a = 0在a.h中定義,直觀感覺上,預設a是0,經過第一次操作應該是2,經過第二次操作應該是10。

但是認為那種直觀感覺是錯的,預期:在funca內,初始a為0,程式結束時main內的a還是2。

#include "a.h"

#include main()

#include #include "a.h"

funca()

static int a = 0;

執行結果:

a(0x8049748) is 0

a(0x8049748) is 2

in funca():a(0x804974c) is 0

in funca():after "a = 10i"a(0x804974c) is 10

a(0x8049748) is 2

實際結果符合預期。實際上產生了兩個變數a,操作上互不相干。

學藝不精,以前經常看到類似形式,比如類和成員,只暴露什麼set和get方法給外部,變數不讓外部操作,雖然那是為了安全和操作統一,和這次情況不太一樣,但是通過動手實踐從另外乙個角度理解了這樣做的好處。也該好好鞏固一下static變數的基礎知識了。

所以最好變數還是在c或cpp檔案中,大不了弄乙個介面函式,宣告到頭檔案暴露出去。對於我的需求,獲取一下位址就行了,畢竟不是變數,是個鍊錶指標,不用set和get那麼麻煩,獲取了位址就好說了。

新問題:

指標預設null,用乙個函式獲取指標,直接對指標進行修改,,再用函式獲取指標,指標還是null。

就是說,不光定義有限制,定義成功後,也不是拿起來位址就能隨便改的?那就在加乙個設定函式?



全域性變數不能放在標頭檔案其中

看網上各種說法說 變數的宣告和變數的定義,可是還是沒有講清楚什麼是宣告什麼是定義,假設說定義要分配記憶體。宣告不分配。這個誰都知道。剛我在vs2012中測試。按理說 int i。僅僅是宣告吧 可是我在乙個標頭檔案其中宣告 int i 然後兩個cpp檔案都呼叫這個.c檔案,出現了重定義錯誤。我改為 i...

勿在標頭檔案中定義static變數

看到有一位同學在標頭檔案中這麼寫 static const wchar t g str1 static const wchar t g str2 這種定義變數的方式我從來沒有見過,而且它還能順利通過編譯,於是我很想知道編譯器是如何處理這種變數定義的。定義全域性變數時使用static,意味著該變數的作...

標頭檔案中用static定義全域性變數的問題

cocos3.13前的版本中,一些全域性變數使用static 定義,研究了static定義全域性變數的優缺點。例如定義下面的標頭檔案 pragma once static int globle 0 static int image 省略 在其他原始檔中,引用cocos.h標頭檔案後,每個原始檔都會儲...