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

标签 c static keyword

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

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

const float kGameSpriteWidth = 12.0f;

这是否应该在 const 前面加上 static ?使用 static 的一些最佳实践是什么?

最佳答案

您不应该在头文件中定义 全局变量。 您应该在 .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 - 什么时候在全局变量前使用 static 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1856599/

相关文章:

c - 制作循环时遇到问题

java - 修复线程不安全 Java 代码的策略?

c - 为什么 'extern' 的声明不适用于 C 中的静态函数?

java - 为 DB2 转义 dbunit 中的保留关键字

c# - VB.net 中的 C# 'internal' 是什么?

python - 为什么Python 3.10中关键字 `match`可以作为变量名或函数名?

c - 为什么 Linux 中的 Makefile 如此有用?

python - 转换mmap对象(mmap不支持串联)/将c代码转换为python

php - 如何在 MAC/OSX 上从源代码编译 PHP

java - Java 何时以及为何在没有编译器或运行时错误的情况下读取未初始化的最终静态变量?