【问题标题】:How to describe all cases of using global variables in C++?如何描述在 C++ 中使用全局变量的所有情况?
【发布时间】:2013-09-25 21:00:37
【问题描述】:

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

这是所有情况吗?

【问题讨论】:

  • 你也会考虑这个吗? int&amp; global_int() { static int i = 0; return i; }

标签: c++ global-variables


【解决方案1】:

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

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

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

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

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

  • 最后,有些人认为任何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;
}

【讨论】:

  • 现在我认识到全局变量可以这样定义: namespace { int global_int; }
  • @MaxSergeev 我还是会小心的。那是全局命名空间中静态存储的,可能是外部链接的变量。将其称为全局变量并没有错,但它并不能描绘出完整的画面。
【解决方案2】:

还有一种情况:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 2019-10-02
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多