【问题标题】:What is the difference between static int a and int a? [duplicate]static int a 和 int a 有什么区别? [复制]
【发布时间】:2011-01-25 09:56:48
【问题描述】:

可能重复:
Difference between 'global' and 'static global'

语句1和2有什么区别:-

#include <stdio.h>
//In the global declaration area 

static int a; // 1.
int b;        // 2.

感谢您的帮助。

【问题讨论】:

  • 除了给出的所有答案之外,值得一提的是,所有静态变量,无论分配在哪里,以及所有全局变量(如上面的“b”),都受制于“静态初始化” ”。这意味着它们必须在程序启动之前由程序初始化。因此,您可以通过标准保证它们已初始化。如果您没有显式初始化它们,它们将被隐式初始化为零(或指针为 NULL)。这也使它们与局部范围变量不同。

标签: c


【解决方案1】:

一个static 全局变量是它所定义的translation unit 的局部变量。因此,如果您在两个不同的翻译单元中定义static int a;,这将创建两个独立变量。如果您在两个翻译单元中定义一个非静态全局变量int b;,您将遇到链接器错误(但您可以在两个翻译单元之一中使用extern int b; 来告诉链接器它应该使用来自另一个翻译单元)。

【讨论】:

    【解决方案2】:

    两者都是变量定义,但是,应用于“全局声明区域”中的变量的static 关键字将全局变量限制为只能在定义它的翻译单元中看到.

    【讨论】:

    • 也就是说,如果它在文件foo.c中,那么bar.c将无法访问它,即使你extern它也是如此。
    • @EboMike +1,感谢您的进一步澄清
    【解决方案3】:

    它们在程序的整个生命周期中都在内存中。声明为 static 的变量仅在声明它的文件中具有作用域,因为没有 static 声明的变量可以使用 extern 声明从其他文件访问。

    原文出处-http://bytes.com/topic/c/answers/860211-global-variable-static-global-variable

    【讨论】:

    • 这个答案是提供的最完整的一个。
    【解决方案4】:

    static int a 只能在该文件中访问。 int b 可以使用 extern int b 从不同的文件中访问。

    【讨论】:

    • 为了迂腐,如果您在头文件中定义static int a,则“在该文件中”将无法访问它;)
    【解决方案5】:
    static int a; 
    int b; 
    

    a 具有内部链接。 b 有外部链接。

    C996.2.2

    6.2.2 标识符的链接

    • 1) 在不同作用域或同一作用域中多次声明的标识符可以是 通过称为链接的过程来引用相同的对象或函数。有 三种链接:外部、内部和无。

    • 2) 在构成整个程序的一组翻译单元和库中,每个 具有外部链接的特定标识符的声明表示相同的对象或 功能。在一个翻译单元中,每个标识符的声明都带有内部 链接表示相同的对象或函数。每个标识符的声明都没有 链接表示一个唯一的实体。

    • 3) 如果对象或函数的文件范围标识符声明包含存储- 类说明符静态,标识符具有内部链接

    【讨论】:

    • 您假设它们都在文件范围内分配。如果它们是在本地分配的,那么您的陈述将不正确。静态仍然有内部链接,但非静态将分配“自动”链接,即在堆栈或 CPU 寄存器中。
    • @Lundin :“您假设它们都在文件范围内分配”再次检查问题。
    【解决方案6】:

    静态变量的生命周期跨越程序的生命周期。但是,范围规则仍然适用。

    如果您在方法之外定义静态变量(通常在类的开头),您的变量将在该类中的任何位置可用。

    您无法更改这些对象的值。它们通常用于存储 API 密钥等内容。

    【讨论】: