有人可以解释在头文件中定义的全局变量或常量之前是否应该使用static关键字吗?
例如,假设我有一个包含以下行的头文件:
const float kGameSpriteWidth = 12.0f;
static
前面是否有const
?使用static
的最佳做法是什么?
答案 0 :(得分:86)
您不应在头文件中定义全局变量。 您应该在.c源文件中定义它们。
如果要在一个.c文件中只显示全局变量,则应将其声明为静态。
如果要在多个.c文件中使用全局变量,则不应将其声明为静态。 相反,您应该在所有需要它的.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;
}
答案 1 :(得分:48)
static
向文件呈现本地变量,这通常是一件好事,例如参见this Wikipedia entry。
答案 2 :(得分:21)
始终在.c
文件中使用静态,除非您需要从其他.c
模块引用该对象。
永远不要在.h
文件中使用静态,因为每次包含它时都会创建一个不同的对象。
答案 3 :(得分:8)
标题文件的经验法则:
extern int foo;
并在单个源文件中放置相应的初始化,以获得跨翻译单元共享的可修改值static const int foo = 42;
获取可以内联的常量答案 4 :(得分:4)
static
表示无法从定义它的编译模块外部访问此变量。
E.g。想象一下你想要访问另一个模块中的变量:
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
的模块之外,您无法从任何地方访问它。
注意,模块是当前源文件, plus 所有包含的文件。即你必须分别编译这些文件,然后将它们链接在一起。
答案 5 :(得分:3)
静态关键字在C中用于限制功能或变量对其翻译单元的可见性。翻译单元是生成目标文件的C编译器的最终输入。
检查:Linkage | Translation unit
答案 6 :(得分:0)
匿名命名空间中C ++的正确机制。如果您想要文件的本地内容,则应使用匿名命名空间而不是静态修饰符。
答案 7 :(得分:-2)
全局静态变量在编译时初始化,与自动
不同