C語言中定義全局變量


(1)在C語言的頭文件中定義變量出現的問題

最好不要傻嘻嘻的在頭文件里定義什么東西。比如全局變量:
  /*xx頭文件*/
  #ifndef 
  _XX_頭文件.H
  #define 
  _XX_頭文件.H
  int A;
  #endif

那么,很糟糕的是,這里的int A
是個全局變量的定義,所以如果這個頭文件被多次引用的話,你的A會被重復定義,顯然語法上錯了。只不過有了這個#ifndef的條件編譯,所以能保證你的頭文件只被引用一次,不過也許還是不會出岔子,但若多個c文件包含這個頭文件時還是會出錯的,因為宏名有效范圍僅限於本c源文件,所以在這多個c文件編譯時是不會出錯的,但在鏈接時就會報錯,說你多處定義了同一個變量

錯誤警告:Linking...
incl2.obj : error LNK2005: "int glb" (?glb@@3HA) 
already defined in incl1.obj
Debug/incl.exe : fatal error LNK1169: one 
or more multiply defined symbols found

 

正確的作法是在c源文件中定義一個全局變量。在頭文件中加入全局變量的聲明

//var.c 一個主要用於定義全局變量的c源文件

int  g_a;
char  g_x;
//var.h 用於聲明定義的全局變量
extern  int   g_a;//使用extern在頭文件中聲明全局變量
extern  char  g_x; 
 
 
//test.c 一個用於測試的頭文件
#include <var.h>
void  f(){
     g_a = 1;
     g_x =  'x' ;
}
 
(3)頭文件中只是變量或着函數的聲明,不是定義
 
對變量而言,如果你想在本源文件中使用另一個源文件的變量,就需要在使用前用extern聲明該變量,或者在頭文件中用extern聲明該變量;
 
對函數而言,如果你想在本源文件中使用另一個源文件的函數,就需要在使用前用聲明該變量,聲明函數加不加extern都沒關系,所以在頭文件中函數可以不用加extern。
 
為了在幾個源文件中共享變量i,首先把變量i的定義放置在一個源文件中: int i; 如果需要對變量i初始化,那么可以在這里放初始值。在編譯這個文件時,編譯器將會為變量i分配內存空間,而其他文件將包含變量i的聲明: extern int i; 通過在每個文件中聲明變量i,使得在這些文件中可以訪問/或修改變量i。然而,由於關鍵字extern,使得編譯器不會在每次編譯其中某個文件時為變量i分配額外的內存空間。當在文件中共享變量時,會面臨和共享函數時相似的挑戰: 確保變量的所有聲明和變量的定義一致。為了避免矛盾,通常把共享變量的聲明(extern int i;)放置在頭文件中。需要訪問特殊變量的源文件可以稍后包含適當的頭文件。此外,含有變量定義的源文件包含每一個含有變量聲明的頭文件,這樣使編譯器可以檢查兩者是否匹配。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM