全局变量和静态全局变量的外部变量

Extern for Global and static global variables

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

我是 c++ 的初学者,我正在浏览一些代码,我读到全局变量会一直持续到我们的程序结束,静态全局变量将具有范围直到该文件的末尾。这是一个示例程序,我尝试访问另一个文件中的全局变量和静态全局变量。

谁能解释一下如何在 c++ 中使用 extern 作为静态全局变量?

如果我有一个同时包含全局和静态全局变量的头文件,并且我将其包含在我的源文件中,并且对两者都使用 extern 并打印其打印值

如果我这样做,它不会给出任何错误或警告。 程序将运行,并且两个值都显示在源文件中

头文件标题.h

int varGlobal;
static int staticVarGlobal = 10

源文件

#include<iostream>
#include "header.h"
extern int varGlobal;
extern int staticVarGlobal;
using namespace std;
int main()
{
cout<<"Global variable : "<<varGlobal<<endl;
cout<<"Static Global variable : "<<++staticVarGlobal<<endl;
}
Output
Global variable : 0
Static Global variable : 11

那么这是如何工作的呢?

static 关键字使变量只有"文件范围",即仅限于该翻译单元。extern 关键字用于需要告诉编译器此变量在其他地方定义的变量。因此,extern 关键字阻止定义,它只是将其作为声明。

int a; // declaring and defininig an integer
extern int b; // declaration, tell the compiler that the definition of b is somewhere else

对于函数,这是隐式的:

void foo();

extern void foo();

谁能解释一下如何将 extern 用于 C++ 中的静态全局变量?

不,这是不可能的。欲了解更多详情,请继续阅读。

即使您使用extern也不能在其他文件中使用static全局(如果我改写externstatic是冲突的说明符(

static全球的生命周期是贯穿程序的整个生命周期。

在不同的编译单元(源文件(中使用static的唯一方法是将此静态变量的地址传递给其他文件,并通过取消引用指针来使用它。

如果我有一个同时包含全局和静态全局变量的头文件 我将其包含在我的源文件中,并使用 extern 进行两者并打印 重视其印刷

静态全局 这之所以有效,是因为为每个源文件创建了变量的不同实例。因此,如果您更改其中一个文件中的变量值,它将不会反映在其他源文件中,因为两个文件的物理位置不同。

非静态全局extern int global是一个声明,它通过头文件进入每个源文件。所有这些都存放在物理上相同的位置。因此,如果您在其中一个文件中更改其值,它也将反映在其他文件中。


更多阅读:存储持续时间

内部联动。可以从 当前翻译单位。
以下任何名称声明于 命名空间范围具有内部链接变量、函数或 声明为静态的函数模板

外部链接。可以从其他翻译单元中的范围引用该名称。具有外部的变量和函数 链接也有语言链接,这使得链接成为可能 用不同的编程语言编写的翻译单元。
上面未列出的变量和函数(即函数 声明的静态、命名空间范围的非常量变量未声明 静态,以及声明为外部的任何变量(

这里有一个你可能会觉得有用的链接:外部变量、全局变量等关键字 extern 如果用于全局变量,则意味着可以从另一个文件访问它,而静态变量具有文件范围 - 它不能从文件外部访问。

可以在一个文件中创建一个全局变量,然后从另一个文件访问它。为此,必须在两个文件中声明变量,但关键字 extern 必须在"第二个"声明之前。

全局静态变量是只能在创建它的文件中访问的变量。此变量称为具有文件范围。

这是堆栈溢出的另一个问题,您可以从那里发布的答案中获得帮助。

将变量声明为静态变量时,将其限制为当前源文件。如果你把它声明为 extern,你说变量存在,但在其他地方声明,如果你没有在其他地方声明它(没有 extern 关键字(,你会得到一个链接错误(找不到符号(。

静态将变量

的范围限制为同一文件,extern 允许从另一个文件访问变量(全局(,在 c++ 中不可能将 extern 用于静态全局变量。