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 ++上,默认情况下全局变量不是extern
或static
。 将变量声明为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 ++变量在范围内不是静态的,即使它们将被分配给静态存储。 例如,如果变量是类成员,则默认情况下,程序中的其他编译单元可以访问它,非类成员也不例外。