有人可以解释何时应该在头文件中定义的全局变量或常量之前使用static关键字吗?
例如,假设我有一个带有以下内容的头文件:
const float kGameSpriteWidth = 12.0f;
应该static
在前面const
吗?有哪些最佳使用方法static
?
有人可以解释何时应该在头文件中定义的全局变量或常量之前使用static关键字吗?
例如,假设我有一个带有以下内容的头文件:
const float kGameSpriteWidth = 12.0f;
应该static
在前面const
吗?有哪些最佳使用方法static
?
extern
源文件之间共享变量? 这些问题的答案有解释如何份额值-和的一个关键部分是使用头声明(但不限定),它们共享变量。如果没有标题可用于放置声明,则变量定义应为静态。如果确实有标头,则在定义变量的位置(仅是一个源文件)和使用标头的位置(可能有许多源文件)都包含标头。
Answers:
您不应在头文件中定义全局变量。您应该在.c源文件中定义它们。
如果全局变量仅在一个.c文件中可见,则应将其声明为静态。
如果要在多个.c文件中使用全局变量,则不应将其声明为静态。相反,您应该在所有需要它的.c文件包含的头文件中将其声明为extern。
例:
例子.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
模块引用该对象,否则请始终在文件中使用static 。
切勿在.h
文件中使用静态对象,因为每次包含对象时都会创建一个不同的对象。
static
是允许同一名称成为两个不同模块中的两个不同对象。
static
在全局变量之前,表示无法从定义该变量的编译模块外部访问此变量。
例如,假设您要访问另一个模块中的变量:
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
编译模块所在的模块访问它。
请注意,模块是当前的源文件,加上所有包含的文件。也就是说,您必须分别编译这些文件,然后将它们链接在一起。
static
隐含了(即static
默认情况下)const
,尽管我建议static
无论如何都对其进行限定,以使意图明确。