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

时间:2009-12-06 21:03:53

标签: c static keyword

有人可以解释在头文件中定义的全局变量或常量之前是否应该使用static关键字吗?

例如,假设我有一个包含以下行的头文件:

const float kGameSpriteWidth = 12.0f;

static前面是否有const?使用static的最佳做法是什么?

8 个答案:

答案 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)

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

不同