我做了2个项目,第一个是C,第二个是C++,两者都使用相同的行为。
C 项目:
标题.h
int varGlobal=7;
主.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=%dnvarGlobal=%dnn",a,i,varGlobal,t);
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
C++项目:
标题.h
int varGlobal=7;
主.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 语言,默认情况下是静态的C++;那么为什么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 关键字:
多个文件包含的标头:
extern int varGlobal;
在其中一个源文件中:
int varGlobal = 7;
当您#include
标头时,就像将代码放入源文件本身一样。在这两种情况下,varGlobal
变量都是在源中定义的,因此无论它如何声明,它都会起作用。
此外,正如注释中指出的那样,文件范围内的C++变量在范围内不是静态的,即使它们将被分配给静态存储。例如,如果变量是类成员,则默认情况下需要可供程序中的其他编译单元访问,非类成员也不例外。