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

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

例如,假设我有一个带有以下内容的头文件:

const float kGameSpriteWidth = 12.0f;

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

Matt Rajca asked 2019-10-08T15:19:19Z
8个解决方案
83 votes

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

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

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

例:

  • 例子.h

    #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;
    }
    
  • foo.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;
    }
    
  • 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;
    }
    
Tomek Szpakowicz answered 2019-10-08T15:21:06Z
47 votes

static在文件本地呈现变量,这通常是一件好事,例如,请参阅此Wikipedia条目。

Dirk Eddelbuettel answered 2019-10-08T15:19:37Z
20 votes

是的,使用静态

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

切勿在.h文件中使用静态对象,因为每次包含该对象时,您都会创建一个不同的对象。

DigitalRoss answered 2019-10-08T15:21:51Z
8 votes

头文件的经验法则:

  • 将变量声明为static const int foo = 42;,并将相应的初始化放入单个源文件中,以获取跨翻译单元共享的可修改值
  • 使用static const int foo = 42;120获得可以内联的常数
Christoph answered 2019-10-08T15:22:39Z
4 votes

var之前的全局变量表示无法从定义该变量的编译模块外部访问此变量。

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

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编译到的模块之外的任何位置访问它。

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

AraK answered 2019-10-08T15:23:34Z
3 votes

在C中使用static关键字将功能或变量的可见性限制为其转换单元。 转换单元是C编译器的最终输入,可从中生成目标文件。

检查此:链接|翻译单位

p.j answered 2019-10-08T15:24:15Z
0 votes

匿名名称空间中C ++的正确机制。 如果您想要文件的本地内容,则应使用匿名名称空间而不是static修饰符。

rmn answered 2019-10-08T15:24:43Z
-2 votes

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

Captain Comic answered 2019-10-08T15:25:11Z
translate from https://stackoverflow.com:/questions/1856599/when-to-use-static-keyword-before-global-variables