When to use static keyword before global variables?
在头文件中定义的全局变量或常量之前,有人能解释什么时候应该使用静态关键字吗?
例如,假设我有一个带有行的头文件:
1 | const float kGameSpriteWidth = 12.0f; |
这应该让
不应在头文件中定义全局变量。您应该在.c源文件中定义它们。
如果全局变量只在一个.c文件中可见,则应将其声明为静态变量。
如果要在多个.c文件中使用全局变量,则不应将其声明为静态变量。相反,您应该在所有需要它的.c文件所包含的头文件中声明它为extern。
例子:
例H
1extern int global_foo;Fo.C
1
2
3
4
5
6
7
8
9
10
11#include"example.h"
int global_foo = 0;
static int local_foo = 0;
int foo_function()
{
/* sees: global_foo and local_foo
cannot see: local_bar */
return 0;
}酒吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14#include"example.h"
static int local_bar = 0;
static int local_foo = 0;
int bar_function()
{
/* sees: global_foo, local_bar */
/* sees also local_foo, but it's not the same local_foo as in foo.c
it's another variable which happen to have the same name.
this function cannot access local_foo defined in foo.c
*/
return 0;
}
是的,使用静态
除非需要从不同的
不要在
头文件的经验法则:
- 将变量声明为
extern int foo; 并在单个源文件中放入相应的初始化,以获得在翻译单元之间共享的可修改值。 - 用
static const int foo = 42; 得到一个可以内联的常数
全局变量之前的
例如,假设您想要访问另一个模块中的变量:
1 2 3 4 5 6 7 8 9 10 | foo.c int var; // a global variable that can be accessed from another module // static int var; means that var is local to the module only. ... bar.c extern int var; // use the variable in foo.c ... |
现在,如果您声明
注意,模块是当前的源文件,加上所有包含的文件。也就是说,您必须分别编译这些文件,然后将它们链接在一起。
静态关键字在C中用于将函数或变量的可见性限制为其翻译单元。翻译单元是C编译器的最终输入,从中生成一个对象文件。
检查:联动装置|翻译单位
在匿名命名空间中C++的正确机制。如果您想要文件的局部内容,您应该使用匿名名称空间,而不是静态修饰符。
与自动变量不同,全局静态变量在编译时初始化