【问题标题】:Difference between extern and global variables? [duplicate]外部变量和全局变量之间的区别? [复制]
【发布时间】:2014-02-03 13:51:50
【问题描述】:
    #include <stdio.h>

    int i;

    int main()

    {

        extern int i;

        if (i == 0)

            printf("scope rules\n");

    }

输出: 范围规则

外部变量在这里如何工作?

为什么没有像这样的错误 Compile time error due to multiple declaration

【问题讨论】:

标签: c extern


【解决方案1】:

extern 实际上并没有创建变量。它就像一个类的前向声明,或者一个函数的原型。变量 "i" 在开头创建一个名为 "i" 的全局整数,它将存在于当前编译单元中,而 "i""int main" 声明了一个名为 "i" 的整数存在于某个编译单元的某个位置,以及名称 "i" 的任何使用情况 strong> 引用那个变量。

【讨论】:

    【解决方案2】:

    因为您可以声明某事物存在任意多次(前提是每次的类型都相同),但您只能定义一次。

    extern int ii 存在的声明,并且是int

    在哪里它存在于文件级别(标题后的int i),具有静态存储持续时间。这意味着它已初始化为零,因此您将始终看到输出 "scope rules"

    这是一个微妙的概念,声明/定义的区别,但它是每个 C 程序员最终都应该好好学习的。

    【讨论】:

    • @Eric,我的“只要类型每次都相同”评论没有涵盖吗?我愿意接受有关如何使其更清晰的建议。也许通过澄清第一句中“某物”的定义来说明名称类型很重要。
    • 我认为没有办法澄清这一点。我删除了我的评论,因为 C 标准在多个地方引用标识符的方式意味着标识符只是组成它的字符串;无论是在文件范围还是块范围内,它都是相同的标识符。但标准并不一致。在 C 2011 6.2.1 4 中,它说“每个其他标识符的范围都由其声明的位置决定……”。但是很明显,这个例子中的i 不仅仅只有一个作用域。它是一个有范围的声明;标识符独立存在。
    • 然后是 C 2011 6.2.1 5,它说“除非另有明确说明,否则本国际标准使用术语“标识符”来指代某些实体(与句法结构相反),它指的是相关名称空间中的实体,其声明在标识符出现时可见。”所以也许我不应该删除我的评论。此外,根据 6.2.7 4,声明不必每次都指定相同的类型;一个声明可以提供额外的信息,标识符的类型变成了两个声明的组合。
    • 所以,这一切都非常复杂,哦,好吧。
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2022-06-16
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多