如何描述在C ++中使用全局变量的所有情况?

时间:2013-09-25 21:00:37

标签: c++ global-variables

我知道可以在程序中随处访问的变量是全局变量。这是一个正确的定义还是应该说“在一个块之外声明的变量”? 我试图了解如何更具体地定义它们。我知道在函数外部简单地声明全局变量的例子(通常在include和using之后)。我知道可以使用extern关键字的前向声明。 以下是3个全局变量(t,d和c)的示例:

#include <iostream>
#include "some.h"
using std::cout;
int t;
extern double d;
int main() {
  extern char c;  // Or here c is not an example of global variable?
  t = 3;
  cout << t;
}

这是所有情况吗?

2 个答案:

答案 0 :(得分:4)

术语“全局变量”可以被抛出很多,有时它并不是真正正确的,因为术语“全局变量”并不是由标准真正定义的。对于可以从“任何地方”访问的变量来说,这是一个非常多产和通用的术语,但这不是全局(特别是因为“任何地方”非常主观!)。

要真正掌握这一点,您需要了解变量的两个主要方面:storagelinkage有一个很好的答案here

让我们看一下“全局变量”的可能定义:

  • 在某些圈子中,“全局变量”表示具有external链接的任何变量。这包括您提供的每个示例。

  • 在其他情况下,internal链接也被视为全局链接。除了第一个组之外,还包括在具有staticconst说明符的函数外部声明的变量。有时这些不被认为是真正的全局,因为它们不能在特定的编译单元之外访问(通常指的是当前的.cpp文件及其在一个blob中包含的所有头文件)。

  • 最后,有些人认为任何static存储变量都是全局的,因为它的存在在整个程序的生命周期中都是持久的。因此,除了第一组和第二组之外,在函数内声明的变量,但声明的static可以称为全局变量。返回对这些的引用是可行的,因此它们仍然可以通过主观的“任何地方”访问。

用你的类似例子总结一下:

extern int extern_int; // externally linked int, static storage (first group)
int just_an_int;       // by default, externally linked int, static storage (first group)
static int static_int; // internally linked int, static storage (second group)
const int const_int;   // by default, internally linked int, static storage (second group)

int & get_no_link_static_int()
{
    static int no_link_static_int = 0; // no linkage int, static storage (third group)
    return no_link_static_int;
}

答案 1 :(得分:1)

还有另一种情况:

文件范围内的静态声明在当前文件中是全局的:

    static int i;
    int main() {
    etc.
    }