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

Mat*_*jca 64 c static keyword

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

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

const float kGameSpriteWidth = 12.0f;
Run Code Online (Sandbox Code Playgroud)

它应该static在前面const吗?使用哪些最佳做法static

Tom*_*icz 91

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

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

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

例:

  • example.h文件

    extern int global_foo;
    
    Run Code Online (Sandbox Code Playgroud)
  • 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 问题是:"有人可以解释你应该在头文件中定义的全局变量或常量之前使用static关键字吗?" 因为OP似乎是初学者,所以我简单地给出了关于在C中定义全局变量的最基本规则.正如你已经注意到自己 - 你通常不能在头文件中使用全局_const_s来做自己的伤害(在C中,它在C++中并不那么简单) ). (4认同)
  • 我想你错过了这一点.这是一个const浮点数,在头文件中定义静态const并在每个转换单元中具有不同的副本没有任何问题.但大多数人只会将#define用于文字. (2认同)

Dir*_*tel 49

static渲染文件的本地变量通常是一件好事,例如参见本维基百科条目.

  • 我认为正确的术语是翻译单位. (52认同)
  • 我不认为这与"文件"有关,而是与"编译模块"有关. (12认同)
  • @alex 这是一个非常好的问题。默认情况下,全局变量是 extern,但无论如何将其标记为 extern 是一个好习惯。 (3认同)
  • 如果变量不是`extern`,则不能从`C` 文件外部访问它。那么将其定义为静态的意义何在? (2认同)

Dig*_*oss 22

是的,使用静态

.c除非您需要从其他.c模块引用对象,否则始终在文件中使用静态.

永远不要在.h文件中使用静态,因为每次包含它时都会创建一个不同的对象.

  • 另一种说法是:`static`的整个要点是*允许*同一名称是两个不同模块中的两个不同对象. (3认同)

Chr*_*oph 8

头文件的经验法则:

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


p.j*_*p.j 6

静态关键字是用C来限制函数或变量的可见性给它的翻译单元。翻译单元是生成目标文件的 C 编译器的最终输入。

检查这个:链接| 翻译单位


Ara*_*raK 5

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
...
Run Code Online (Sandbox Code Playgroud)

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

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