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

时间:2012-06-15 17:52:25

标签: c++ c static global-variables extern

我制作了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; 相同,如果它是静态的,那么它只能在它声明的文件中使用,正确?

2 个答案:

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