昨天下午將全局變量定義在H文件中導致鏈接時提示變量在多個obj文件內重復。
解決辦法如下:
將變量移入C文件中進行定義,然后在H文件中加入extern在變量之前。
這樣當其它C文件引用該全局變量時就會去鏈接這個變量符號而不是重新生成。
另附防止H文件被重復包含的處理方法:
#ifndef _H文件名_H_
#define _H文件名_H_
//H文件內容
#endif
這個
關鍵字真的比較可惡,在定義(函數)的時候,這個extern居然可以被省略,所以會讓你搞不清楚到底是聲明還是定義,下面分變量和函數兩類來說:
尤其是對於變量來說。
extern int a;//聲明一個全局變量a
int a; //定義一個全局變量a
extern int a =0 ;//定義一個全局變量a 並給初值。一旦給予賦值,一定是定義,定義才會分配存儲空間。
int a =0;//定義一個全局變量a,並給初值,
聲明之后你不能直接使用這個變量,需要定義之后才能使用。
第四個等於第三個,都是定義一個可以被外部使用的全局變量,並給初值。
糊塗了吧,他們看上去可真像。但是定義只能出現在一處。也就是說,不管是int a;還是int a=0;都只能出現一次,而那個extern int a可以出現很多次。
當你要引用一個全局變量的時候,你就要聲明extern int a;這時候extern不能省略,因為省略了,就變成int a;這是一個定義,不是聲明。