3

我知道程序中任何地方都可以访问的变量是全局的。这是一个正确的定义还是我们应该说“在块外声明的变量”?我试图了解如何更具体地定义它们。我知道在函数外部简单声明全局变量的示例(通常在包含和使用之后)。我知道可以使用带有 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;
}

都是这样吗?

4

2 回答 2

4

术语“全局变量”可以抛出很多,有时它并不那么正确,因为术语“全局变量”并没有真正由标准定义。对于可从“任何地方”访问的变量,这是一个非常多产且常见的术语,但这并不是全部(尤其是因为“任何地方”是高度主观的!)。

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

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

  • 在某些圈子中,“全局变量”是指任何具有external链接的变量。这包括你给出的每一个例子。

  • 在其他情况下,internal链接也被认为是全局的。除了第一组之外,这将包括在函数之外用staticorconst说明符声明的变量。有时这些并不被认为是真正的全局,因为它们无法在特定编译单元之外访问(通常是指当前的 .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;
}
于 2013-09-25T21:37:27.943 回答
1

还有一种情况:

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

    static int i;
    int main() {
    etc.
    }
于 2013-09-25T21:41:03.190 回答