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

问题描述 投票:0回答:4

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

static
是否有用?

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

c++ static global-variables global static-variables
4个回答
20
投票

是的,如果你想声明文件范围变量,那么

static
关键字是必要的。
static
在一个翻译单元中声明的变量不能从另一个翻译单元引用。


顺便说一句,在 C++03 中不推荐使用

static
关键字。

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

static关键字的使用是 在 a 中声明对象时已弃用 命名空间范围;这 未命名命名空间提供了优越的 替代方案。

C++ 更喜欢 unnamed 命名空间而不是

static
关键字。请参阅此主题:

未命名命名空间相对于静态的优越性?


19
投票

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

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


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();                   
}

仅当程序终止/退出时,它们才不再存在。


0
投票

全局范围内的静态意味着变量或函数仅对定义它的翻译单元可见。静态也可以用于局部变量,这意味着它们将被放置在静态内存中。

例如,考虑一个具有两个 .cpp 文件的项目:x.cpp 和 y.cpp。这两个文件都有一个名为 var 的全局变量。当链接器尝试完成其工作并形成可执行文件时,它将无法解析对“var”的不明确引用。如果一个或两个“var”变量被标记为静态,则该变量将不会链接到另一个文件。您可以将其视为将“var”声明为文件私有。

在局部作用域中,静态表示变量将在编译时初始化一次并放置在静态内存中。这意味着它将在多次函数调用中保留其值。将此与标准局部变量进行对比,其中每个函数调用都会将新实例推入堆栈。

希望这有帮助。如需更深入的解释,请查看:https://www.youtube.com/watch?v=g4Dn2cwSrC4

© www.soinside.com 2019 - 2024. All rights reserved.