最近遇到了乙個問題,就是乙個標頭檔案有乙個static的變數,編譯的檔案有幾個.o的,他們都引用了這個標頭檔案,但是當列印出這個變數(經過修改了)的值得時候,居然不一樣,列印出位址來,位址居然也不一樣。兩個不同位址,乙個相同的變數名?究竟怎麼回事情呢???
這個變數許多檔案要用。但是放到**件,又是個問題啊。。。
使用extern 宣告外部變數,必須符合下面的情況
生成的.o 不能引用包括這個變數定義的檔案。但是我又使用了這個標頭檔案的其他函式,鬱悶了。
經過試驗 應是這樣的,變數 不要用static,因為外部要extern使用,反而不能用static了 才鬱悶呢。
實驗如下:
head1.h
#includeextern
int str_i;
head1.c
#include "head1.h
"int str_j=5;
int main()
head2.h
#includeextern
int str_j;
int str_i=1;
void func();
head2.c
#include "head2.h
"void func()
編譯方法為:
gcc -c head1.cgcc -c head2.c
gcc -o main head1.o head2.o
或者
gcc -c head2.cgcc -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,所以這裡有乙個點要注意,在乙個方法中開了一塊記憶體,過了這個方法,是區域性變數的指標沒了,記憶體銷不銷毀看的是引用計數,跟方法過了沒有...