我知道可以在程序中随处访问的变量是全局变量。这是一个正确的定义还是应该说“在一个块之外声明的变量”? 我试图了解如何更具体地定义它们。我知道在函数外部简单地声明全局变量的例子(通常在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;
}
这是所有情况吗?
答案 0 :(得分:4)
术语“全局变量”可以被抛出很多,有时它并不是真正正确的,因为术语“全局变量”并不是由标准真正定义的。对于可以从“任何地方”访问的变量来说,这是一个非常多产和通用的术语,但这不是全局(特别是因为“任何地方”非常主观!)。
要真正掌握这一点,您需要了解变量的两个主要方面:storage
和linkage
有一个很好的答案here。
让我们看一下“全局变量”的可能定义:
在某些圈子中,“全局变量”表示具有external
链接的任何变量。这包括您提供的每个示例。
在其他情况下,internal
链接也被视为全局链接。除了第一个组之外,还包括在具有static
或const
说明符的函数外部声明的变量。有时这些不被认为是真正的全局,因为它们不能在特定的编译单元之外访问(通常指的是当前的.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.
}