C語言零碎記錄之extern

2021-09-08 16:01:07 字數 1131 閱讀 6278

最近遇到了乙個問題,就是乙個標頭檔案有乙個static的變數,編譯的檔案有幾個.o的,他們都引用了這個標頭檔案,但是當列印出這個變數(經過修改了)的值得時候,居然不一樣,列印出位址來,位址居然也不一樣。兩個不同位址,乙個相同的變數名?究竟怎麼回事情呢???

這個變數許多檔案要用。但是放到**件,又是個問題啊。。。

使用extern 宣告外部變數,必須符合下面的情況

生成的.o 不能引用包括這個變數定義的檔案。但是我又使用了這個標頭檔案的其他函式,鬱悶了。

經過試驗 應是這樣的,變數 不要用static,因為外部要extern使用,反而不能用static了 才鬱悶呢。

實驗如下:

head1.h

#include 

extern

int str_i;

head1.c

#include "

head1.h

"int str_j=5;

int main()

head2.h

#include 

extern

int str_j;

int str_i=1;

void func();

head2.c

#include "

head2.h

"void func()

編譯方法為:

gcc -c head1.c

gcc -c head2.c

gcc -o main head1.o head2.o

或者

gcc -c head2.c

gcc -o main head1.c head2.o

結果如下:

$ ./main

str_i=1

str_j=6

str_i=999

head2 要使用的資源使用了

head1 要使用的資源也使用了。

但是head1不能使用head2的標頭檔案,否則重複定義。

head2也不能使用head1的標頭檔案,否則重複定義。

看來 使用 別人的東西,不一定要加 標頭檔案的。函式宣告 也沒必要,只要在gcc中有對應的。o或lib就可以了。

C語言零碎記錄之atexit和中斷

c語言是過程式的語言,執行一般是 從前到後.但是比如使用者按了ctrl c 中斷了程式,程式就沒辦法執行某些結束的 了.可以使用atexit 函式,在main 靠前的地方加上這些 其後 如果程式 不管怎麼中斷,都會執行atexit 的.如果atexit函式裡面有個死迴圈,我想 你ctrl c 是不太...

零碎的記錄

高內聚 類與類之間的關係而定,高,意思是他們之間的關係要簡單,明了,不要有很強的關係,不然,執行起來就會出問題。乙個 類的執行影響到其他的類。低偶合 類內部的方法而言。把程式的功能盡量分散,別在乙個類裡只寫乙個或很好的方法,因為那樣會給你的除錯等帶來很多問題 出了錯你都不知道在什麼地方。通用模組的設...

記憶體管理 零碎記錄

1.以下方法中區域性變數myarray和全域性變數 sqldata.array引用了同一塊記憶體 當這個方法過了,這個區域性變數的指標就被銷毀,引用計數就由2變成1,所以這裡有乙個點要注意,在乙個方法中開了一塊記憶體,過了這個方法,是區域性變數的指標沒了,記憶體銷不銷毀看的是引用計數,跟方法過了沒有...