C/C++报错:全局变量重定义或是多次定义
很多人可能直接把全局變量寫進.h文件,然后用多個文件包含這個頭文件,編譯時就會報錯:變量重定義…
頭文件的作用就是要給外部提供接口使用的,所以請記住, 只在.h中做聲明,在.cpp文件中進行定義,而不要在.h 文件中定義,真理總是這么簡單。
那其他文件如何使用這些全局變量呢?
全局變量要在.h 文件中聲明,在.cpp文件中定義。定義好了之后,可以在.h文件中利用extern關鍵字進行聲明。
下面通過一個示例為大家展示:
在test.cpp 中定義全局變量
int g_MaxTime;
int g_MinTime;
int g_MaxCount;
int g_MinCount;
在test.h 中聲明全局變量
extern int g_MaxTime;
extern int g_MinTime;
extern int g_MaxCount;
extern int g_MinCount;
然后其他文件要使用這些變量的時候,只要 #include “test.h” 就可以了,而且不會引起重復定義的錯誤。
??extern int a;??//聲明一個全局變量a
??int a; ?????//定義一個全局變量a
??extern int a =0;?//定義一個全局變量a 并給初值
??int a =0;????//定義一個全局變量a,并給初值
??對變量而言,如果你想在本源文件中使用另一個源文件的變量,就需要在使用前用extern聲明該變量,或者在頭文件中用extern聲明該變量;
??對函數而言,如果你想在本源文件中使用另一個源文件的函數,就需要在使用前用聲明該函數,聲明函數加不加extern都沒關系,所以在頭文件中函數可以不用加extern。
C程序采用模塊化的編程思想,需合理地將一個很大的軟件劃分為一系列功能獨立的部分合作完成系統的需求,在模塊的劃分上主要依據功能。模塊由頭文件和實現文件組成,對頭文件和實現文件的正確使用方法是:
規則1:頭文件(.h)中是對于該模塊接口的聲明,接口包括該模塊提供給其它模塊調用的外部函數及外部全局變量,對這些變量和函數都需在.h中文件中冠以extern關鍵字聲明;
規則2:模塊內的函數和全局變量需在.c文件開頭冠以static關鍵字聲明;?
規則3:永遠不要在.h文件中定義變量;
??許多程序員對定義變量和聲明變量混淆不清,定義變量和聲明變量的區別在于定義會產生內存分配的操作,是匯編階段的概念;而聲明則只是告訴包含該聲明的模塊在連接階段從其它模塊尋找外部函數和變量。如:
在module1.h文件中:int a = 5;
在模塊1中:#include "module1.h"
在模塊2中:#include "module1.h"
在模塊3中:#include "module1.h"
以上程序的結果是在模塊1、2、3中都定義了整型變量a,a在不同的模塊中對應不同的地址單元,這明顯不符合編寫者的本意。
正確的做法是:
在module1.h文件中:extern int a;
在module1.c/cpp文件中:int a = 5;
在模塊1中:#include "module1.h"
在模塊2中:#include "module1.h"
在模塊3中:#include "module1.h"
這樣如果模塊1、2、3操作a的話,對應的是同一片內存單元。
規則4:如果要用其它模塊定義的變量和函數,直接包含其頭文件即可。
許多程序員喜歡這樣做,當他們要訪問其它模塊定義的變量時,他們在本模塊文件開頭添加這樣的語句:
extern int count ;
拋棄這種做法吧,只要頭文件按 規則1 完成,某模塊要訪問其它模塊中定義的全局變量時,只要包含該模塊的頭文件即可。
原文:https://blog.csdn.net/qq_15345177/article/details/88550200?
?
總結
以上是生活随笔為你收集整理的C/C++报错:全局变量重定义或是多次定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6个变态的C语言写的Hello Worl
- 下一篇: C++ 包含目录、库目录、附加依赖项总结