【问题标题】:Use of static variables and functions in global scope在全局范围内使用静态变量和函数
【发布时间】:2011-06-11 03:29:08
【问题描述】:

当变量位于 .cpp 文件的全局范围内而不是函数中时,将其标记为 static 是否有用?

你也可以对函数使用 static 关键字吗?如果是,它们的用途是什么?

【问题讨论】:

  • 听起来好像有人叫任何作业

标签: c++ static global-variables global static-variables


【解决方案1】:

在这种情况下,关键字 static 意味着函数或变量只能由同一 cpp 文件中的代码使用。关联的符号不会被导出,也不会被其他模块使用。

当您知道其他模块不需要您的全局函数或变量时,这是避免在大型软件中发生名称冲突的好习惯。

【讨论】:

  • 在 C++ 中应该使用未命名的命名空间。
【解决方案2】:

是的,如果你想声明文件范围变量,那么static 关键字是必须的。 static 在一个翻译单元中声明的变量不能被另一个翻译单元引用。


顺便说一句,在 C++03 中不推荐使用 static 关键字。

C++ 标准 (2003) 中的 $7.3.1.1/2 部分内容如下:

static关键字的使用是 在 a 中声明对象时不推荐使用 命名空间范围;这 unnamed-namespace 提供了一个优越的 替代。

C++ 更喜欢 unnamed 命名空间而不是 static 关键字。请参阅此主题:

Superiority of unnamed namespace over static?

【讨论】:

  • 最新的 C++0x 草案取消了它。
  • @Fred:有趣,它在 n3092 和 n3225 之间发生了变化,你知道是什么促成了这种变化吗?
  • @Matthieu:这更有趣。你能告诉我们是什么推动了这种变化吗?或者至少向我们推荐一个链接?
  • 我找不到任何真正相关的东西,我已经问过这个问题 (stackoverflow.com/questions/4726570/…),希望 SO 上的人对此有所了解。
【解决方案3】:

举个例子-

// At global scope
int globalVar; // Equivalent to static int globalVar;
               // They share the same scope
               // Static variables are guaranteed to be initialized to zero even though
               //    you don't explicitly initialize them.


// At function/local scope

void foo()
{
    static int staticVar ;  // staticVar retains it's value during various function
                            // function calls to foo();                   
}

它们都只有在程序终止/退出时才停止存在。

【讨论】:

  • 但是函数作用域的静态变量是在运行时初始化还是仅在其作用域函数(在本例中为 foo() 运行时)初始化?
  • @Mahesh 如果您默认不指定静态,那么 globalVar 不是非静态的吗?我认为可以轻松扩展非静态全局变量。
猜你喜欢
  • 2023-03-29
  • 2016-07-26
  • 1970-01-01
  • 2015-03-22
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多