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

static and extern global variables in C and C++

本文关键字:外部 全局变量 静态 C++      更新时间:2023-10-16

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