在C和C静态和extern全局变量++在C和C静态和extern全局变量++(static and

2019-06-01 04:15发布

余由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;
}

我读了全局变量默认情况下,并在C和静态使用C extern关键字默认++; 那么,为什么C ++代码的作品?

我的意思是诠释varGlobal = 7; 是相同的静态INT varGlobal = 7; 如果它是静态的话,就只能在它被宣布,就在文件中使用?

Answer 1:

全局变量是没有extern也不是static默认情况下,C和C ++。 当一个变量声明为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;


Answer 2:

当您#include一个头,这是完全一样,如果你把代码到源文件本身。 在这两种情况下, varGlobal变量在源定义,因此它会工作,不管它是如何声明。

另外,作为在评论中指出,C ++在文件范围变量不是静态的范围,即使他们将被分配到静态存储。 如果变量是例如一个类的成员,它需要是没有不同的访问默认和非类成员在程序中的其他编译单元。



文章来源: static and extern global variables in C and C++