我制作了2个项目,第一个用C语言,第二个用C ++编写,两者都有相同的行为。
C项目:
header.h
int varGlobal=7;
的main.c
#include <stdio.h>
#include <stdlib.h>
#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 <iostream>
#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 ++中默认为 static ;那么为什么C ++代码有效?
我的意思是 int varGlobal = 7; 与 static int varGlobal = 7; 相同,如果它是静态的,那么它只能在它声明的文件中使用,正确?
答案 0 :(得分:75)
在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;
答案 1 :(得分:6)
当您#include
标题时,就像将代码放入源文件本身一样。在这两种情况下,varGlobal
变量都在源中定义,因此无论它如何声明它都可以工作。
同样如评论中所指出的,文件范围内的C ++变量在范围内不是静态的,即使它们将被分配给静态存储。例如,如果变量是类成员,则默认情况下,程序中的其他编译单元可以访问它,非类成员也不例外。