关于C#:何时在全局变量之前使用static关键字?

When to use static keyword before global variables?

在头文件中定义的全局变量或常量之前,有人能解释什么时候应该使用静态关键字吗?

例如,假设我有一个带有行的头文件:

1
const float kGameSpriteWidth = 12.0f;

这应该让staticconst前面吗?使用static有哪些最佳实践?


不应在头文件中定义全局变量。您应该在.c源文件中定义它们。

  • 如果全局变量只在一个.c文件中可见,则应将其声明为静态变量。

  • 如果要在多个.c文件中使用全局变量,则不应将其声明为静态变量。相反,您应该在所有需要它的.c文件所包含的头文件中声明它为extern。

例子:

  • 例H

    1
    extern 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;
    }


static将变量呈现为文件的局部变量,这通常是一件好事,例如,请参阅这个wikipedia条目。


是的,使用静态

除非需要从不同的.c模块引用对象,否则在.c文件中始终使用static。

不要在.h文件中使用static,因为每次包含它时都会创建不同的对象。


头文件的经验法则:

  • 将变量声明为extern int foo;并在单个源文件中放入相应的初始化,以获得在翻译单元之间共享的可修改值。
  • static const int foo = 42;得到一个可以内联的常数

全局变量之前的static表示该变量不能从定义它的编译模块外部访问。

例如,假设您想要访问另一个模块中的变量:

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
...

现在,如果您声明var是静态的,那么除了编译foo.c的模块之外,您不能从任何地方访问它。

注意,模块是当前的源文件,加上所有包含的文件。也就是说,您必须分别编译这些文件,然后将它们链接在一起。


静态关键字在C中用于将函数或变量的可见性限制为其翻译单元。翻译单元是C编译器的最终输入,从中生成一个对象文件。

检查:联动装置|翻译单位


在匿名命名空间中C++的正确机制。如果您想要文件的局部内容,您应该使用匿名名称空间,而不是静态修饰符。


与自动变量不同,全局静态变量在编译时初始化