什么时候在全局variables之前使用static关键字?
有人可以解释什么时候你应该使用静态关键字之前全局variables或常量定义在头文件?
例如,让我说我有一个头文件的行:
const float kGameSpriteWidth = 12.0f;
应该在const
前面有static
吗? 什么是使用static
一些最佳实践?
static
呈现文件的本地variables,这通常是一件好事,参见例如这个维基百科条目 。
你不应该在头文件中定义全局variables。 你应该在.c源文件中定义它们。
-
如果全局variables仅在一个.c文件中可见,则应声明为静态。
-
如果要在多个.c文件中使用全局variables,则不应将其声明为静态。 相反,您应该在需要它的所有.c文件包含的头文件中声明它为extern。
例:
-
example.h文件
extern int global_foo;
-
foo.c的
#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; }
-
bar.c
#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; }
是的,使用静态
除非需要从不同的.c
模块引用对象,否则应始终在.c
文件中使用静态。
切勿在.h
文件中使用静态,因为每次包含它时都会创build一个不同的对象。
头文件的经验法则:
- 将variables声明为
extern int foo;
并将相应的初始化放在单个源文件中,以获得跨翻译单元共享的可修改值 - 使用
static const int foo = 42;
得到一个可以内联的常量
全局variables之前的static
意味着该variables不能从编译模块定义的外部访问。
假设你想要访问另一个模块中的variables:
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 ...
现在,如果你声明var
是静态的,你就不能从foo.c
被编译到的模块中的任何地方访问它。
请注意,一个模块是当前的源文件, 加上所有包含的文件。 即您必须分别编译这些文件,然后将它们链接在一起。
在C中使用static关键字来限制函数或variables对其翻译单元的可见性。 翻译单元是生成目标文件的C编译器的最终input。
检查这个: 链接 | 翻译单位
匿名命名空间中C ++的正确机制。 如果你想要的东西是本地的文件,你应该使用匿名命名空间而不是静态修饰符。
阅读: http : //cplusplus.co.il/2009/09/24/everything-about-namespaces/
全局静态variables在编译时初始化,不像自动