全局变量和静态全局变量的外部变量
Extern for Global and static global variables
我是 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
全局(如果我改写extern
和static
是冲突的说明符(
但static
全球的生命周期是贯穿程序的整个生命周期。
在不同的编译单元(源文件(中使用static
的唯一方法是将此静态变量的地址传递给其他文件,并通过取消引用指针来使用它。
如果我有一个同时包含全局和静态全局变量的头文件 我将其包含在我的源文件中,并使用 extern 进行两者并打印 重视其印刷
静态全局 这之所以有效,是因为为每个源文件创建了变量的不同实例。因此,如果您更改其中一个文件中的变量值,它将不会反映在其他源文件中,因为两个文件的物理位置不同。
非静态全局extern int global
是一个声明,它通过头文件进入每个源文件。所有这些都存放在物理上相同的位置。因此,如果您在其中一个文件中更改其值,它也将反映在其他文件中。
更多阅读:存储持续时间
内部联动。可以从 当前翻译单位。
以下任何名称声明于 命名空间范围具有内部链接变量、函数或 声明为静态的函数模板
和
外部链接。可以从其他翻译单元中的范围引用该名称。具有外部的变量和函数 链接也有语言链接,这使得链接成为可能 用不同的编程语言编写的翻译单元。
上面未列出的变量和函数(即函数 声明的静态、命名空间范围的非常量变量未声明 静态,以及声明为外部的任何变量(
这里有一个你可能会觉得有用的链接:外部变量、全局变量等关键字 extern 如果用于全局变量,则意味着可以从另一个文件访问它,而静态变量具有文件范围 - 它不能从文件外部访问。
可以在一个文件中创建一个全局变量,然后从另一个文件访问它。为此,必须在两个文件中声明变量,但关键字 extern 必须在"第二个"声明之前。
全局静态变量是只能在创建它的文件中访问的变量。此变量称为具有文件范围。
这是堆栈溢出的另一个问题,您可以从那里发布的答案中获得帮助。
静态将变量将变量声明为静态变量时,将其限制为当前源文件。如果你把它声明为 extern,你说变量存在,但在其他地方声明,如果你没有在其他地方声明它(没有 extern 关键字(,你会得到一个链接错误(找不到符号(。
的范围限制为同一文件,extern 允许从另一个文件访问变量(全局(,在 c++ 中不可能将 extern 用于静态全局变量。
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 在.cpp文件之间传递全局字符串变量?
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 为什么使用 SPI 时,全局缓冲区变量产生的结果与局部缓冲区变量不同
- 全局销毁期间全局布尔变量可靠吗?
- 全局自动变量可以在 h 文件中声明吗?
- 将全局外部变量的私有版本与 OpenMP 结合使用
- 使用全局 lua_State* 变量
- 为什么C 17中的全局内线变量和静态内线成员需要警卫
- 为全局constexpr变量生成唯一值
- C++:为全局类变量赋值
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 全局静态变量不"staying defined"函数外部
- 为什么不调用全局静态变量的析构函数
- 全局使用变量定义和C 声明
- 定义,初始化全局const变量是安全的吗?
- C 全局对象变量内存释放
- 全局静态变量阴影
- C++ 中的全局类变量与指针
- 可以静态访问全局静态变量的静态函数