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

时间:2015-02-25 12:05:16

标签: c++

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

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

如果我有一个包含全局和静态全局变量的头文件,并且我将它包含在我的源文件中,则使用extern作为两者并打印值打印

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

头文件 header.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

那么这是如何运作的?

3 个答案:

答案 0 :(得分:1)

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();

答案 1 :(得分:0)

  

任何人都可以解释如何使用extern来实现   c ++中的静态全局变量?

不,这是不可能的。有关详细信息,请继续阅读。

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

static全球的生命时间贯穿整个计划的生命周期。

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

  

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

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

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


进一步阅读:storage duration

  

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

  

外部链接。该名称可以从其他翻译单元的范围中引用。变量和函数与外部   链接也有语言链接,这使得链接成为可能   用不同编程语言编写的翻译单元   上面没有列出的变量和函数(即函数不是   声明的static,namespace-scope非const变量未声明   static,以及任何变量声明为extern

答案 2 :(得分:0)

以下是您可能会发现有用的链接: extern, global variables etc     如果用于全局变量,关键字 extern 意味着它可以从其他文件访问,而静态变量具有文件范围 - 无法从文件外部访问它。 / p>

  

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

     

全局静态变量是只能在创建它的文件中访问的变量。据说这个变量有文件范围。

这是来自堆栈溢出的another question,您可以从那里发布的答案中获得帮助。

  

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

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