C和C ++中的静态和外部全局变量

我做了2个项目,第一个用C语言,第二个用C ++编写,两个项目都有相同的行为。

C项目:

header.h

int varGlobal=7; 

main.c中

 #include  #include  #include "header.h" void function(int i) { static int a=0; a++; int t=i; i=varGlobal; varGlobal=t; printf("Call #%d:\ni=%d\nvarGlobal=%d\n\n",a,i,varGlobal,t); } int main() { function(4); function(6); function(12); return 0; } 

C ++项目:

header.h

 int varGlobal=7; 

main.cpp中

 #include  #include "header.h" using namespace std; void function(int i) { static int a=0; int t=i; a++; i=varGlobal; varGlobal=t; cout<<"Call #"<<a<<":"<<endl<<"i="<<i<<endl<<"varGlobal="<<varGlobal<<endl<<endl; } int main() { function(4); function(6); function(12); return 0; } 

我读到默认情况下全局变量是extern ,在C ++中默认是C和static ; 那么为什么C ++代码有效呢?

我的意思是int varGlobal = 7;static int varGlobal = 7相同; 如果它是静态的,那么它只能在它声明的文件中使用,对吧?

在C和C ++上,默认情况下全局变量不是externstatic 。 将变量声明为static ,将其限制为当前源文件。 如果您将其声明为extern ,则表示该变量存在,但在其他地方声明,如果您没有在其他地方声明它(没有extern关键字),您将收到链接错误(未找到符号)。

当您有更多源文件(包括该标题)时,您的代码将中断,在链接时,您将有多个varGlobal引用。 如果你将它声明为static ,那么它将使用多个源(我的意思是,它将编译和链接),但每个源都有自己的varGlobal

你在C ++中可以做的就是在C中不能将变量声明为const ,如下所示:

 const int varGlobal = 7; 

并且包含多个来源,而不会在链接时破坏事物。 我们的想法是将旧C风格的#define替换为常量。

如果你需要一个在多个源上可见的全局变量而不是const ,请在头文件中将其声明为extern ,并在源文件上再次声明它,这次没有extern keywork:

多个文件包含的标题:

 extern int varGlobal; 

在您的一个源文件中:

 int varGlobal = 7; 

#include标题时,就像将代码放入源文件本身一样。 在这两种情况下, varGlobal变量都在源中定义,因此无论它如何声明它都可以工作。

同样如注释中所指出的,文件范围内的C ++变量在范围内不是静态的,即使它们将被分配给静态存储。 例如,如果变量是类成员,则默认情况下,程序中的其他编译单元可以访问它,非类成员也不例外。