全局和静态全局变量的外部 我是C++初学者,我正在读一些代码,我读到全局变量一直存在到程序结束,静态全局变量将有范围直到文件的结尾。这里是一个示例程序,我试图访问另一个文件中的全局变量和静态全局变量。 谁能解释一下C++中如何使用外部变量来处理静态全局变量?< /p>

全局和静态全局变量的外部 我是C++初学者,我正在读一些代码,我读到全局变量一直存在到程序结束,静态全局变量将有范围直到文件的结尾。这里是一个示例程序,我试图访问另一个文件中的全局变量和静态全局变量。 谁能解释一下C++中如何使用外部变量来处理静态全局变量?< /p>,c++,C++,如果我有一个包含全局变量和静态全局变量的头文件,并且我将其包含在源文件中,那么使用extern同时打印和打印其值 如果我这样做,它不会给出任何错误或警告。程序将运行,两个值都显示在源文件中 #include<iostream> #include "header.h" extern int varGlobal; extern int staticVarGlobal; using namespace std; int main() { cout<<"Global var

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

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

#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;
}
头文件 标题.h

源文件

#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;
}
那么这是如何工作的呢

有人能解释一下如何使用extern来 C++中的静态全局变量? 不,这是不可能的。欲知更多详情,请继续阅读

即使使用
extern
,也不能在其他文件中使用
static
global(如果我重新表述
extern
static
是冲突的说明符)

但是
static
global的生命周期贯穿于程序的整个生命周期

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

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

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

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


进一步阅读:

内部链接。可以从中的所有作用域引用该名称 当前翻译单位。
在 命名空间范围具有内部链接变量、函数或 声明的函数模板静态

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


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如果用于全局变量,则表示可以从另一个文件访问该变量,而static变量具有文件范围-无法从文件外部访问该变量

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

int a; // declaring and defininig an integer
extern int b; // declaration, tell the compiler that the definition of b is somewhere else
全局静态变量只能在创建它的文件中访问。该变量被称为具有文件作用域

这里是stack overflow,您可以从那里发布的答案中获得帮助

当您将变量声明为静态变量时,您将其限制为当前源文件。如果将其声明为extern,则表示该变量存在,但在其他地方声明,如果未在其他地方声明该变量(没有extern关键字),则会出现链接错误(未找到符号)


静态限制变量范围到同一文件,外部允许变量(全局)从另一个文件中访问,在C++中不可能使用外部变量来处理静态全局变量。代码>静态链接是指翻译单元内部的内部链接<代码>静态生命周期是指从程序开始到结束。当然,
static
意味着两者。使用
extern
可以获得外部链接和静态生存期。在C++标准中没有源代码“文件”的概念,但在实践中使用文件。这意味着你应该对涉及“C++”的概念的语句非常怀疑,例如C++范围规则:它很可能是垃圾。