在全局范围内使用静态变量和函数

23

当一个变量位于 .cpp 文件的全局作用域,而不是在函数中时,将其标记为 static 有何用途?

函数是否也可以使用 static 关键字?如果是,那么它们有什么用途?


30
听起来像是有人称任何事情为作业。 - org 100h
3个回答

20

是的,如果你想声明文件作用域变量,那么必须使用static关键字。在一个翻译单元中声明的static变量无法从另一个翻译单元中引用。


顺便说一下,在C++03中,static关键字的使用已经被弃用了。

C++标准(2003)第7.3.1.1/2节内容如下:

在命名空间范围内声明对象时,使用static关键字已经不推荐使用;匿名命名空间提供了更好的替代方案。

C++更喜欢使用未命名命名空间而不是static关键字。参见此主题:

未命名命名空间的优越性?


6
最新的C++0x草案取消了对它的废弃标记。 - Fred Nurk
@Fred:有趣的是,在n3092和n3225之间发生了变化,你知道是什么促使了这种变化吗? - Matthieu M.
@Matthieu:这更有趣了。你能告诉我们是什么促使了这个变化吗?或者至少给我们提供一个链接吗? - Nawaz
1
我没有找到任何真正相关的东西,我已经提出了问题(https://dev59.com/32445IYBdhLWcg3wucio),希望SO上的某个人知道一些关于它的事情。 - Matthieu M.

19
在这种情况下,关键字“static”表示函数或变量只能被同一cpp文件中的代码使用。相关符号不会被导出,也不能被其他模块使用。
当您知道全局函数或变量不需要在其他模块中使用时,避免名称冲突是一个好的实践。

14
在C++中,应该使用匿名命名空间。 - Matthieu M.

1
以一个例子来说明 -
// 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())运行时初始化? - James Kuang
@Mahesh 如果你没有默认指定静态变量,那么globalVar不是非静态的吗?我认为可以很容易地扩展非静态全局变量。 - starkk92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接