什么时候在全局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在编译时初始化,不像自动