【问题标题】:Static storage class静态存储类
【发布时间】:2013-06-23 14:04:02
【问题描述】:

我是 C 初学者,目前正在学习数据类型修订章节。我已经解决了很多静态存储类的程序。静态存储类具有本地范围。在下面的代码中,静态变量在 main 上方声明,即全局变量。这可能吗 ?并且根据静态存储类特性的o/p是正确的。

static int y ;
main( )
{
static int z ;
printf ("%d %d", y, z ) ;
}

谁能告诉我main上面的静态变量声明是正确的吗?如果这是正确的,请尝试用外行语言解释。

【问题讨论】:

    标签: c


    【解决方案1】:

    存储类和范围是不同的东西。 static 关键字不影响作用域。

    存储类与对象的生命周期或存储持续时间有关:创建时间和生命周期结束时间。不幸的是,由于历史原因,存储类和其他概念有些混合。存储类有一些关于哪里东西存储的内涵。 C 已经发展,因此关于存储在哪里的决定很大程度上取决于实现。通常,程序员应该只关心何时存储某些内容。

    存储类是对象的属性:被存储的实际事物(值)。范围是标识符的属性:用于引用对象(或类型或函数)的名称。

    有四种存储持续时间:静态、线程、自动和分配。作用域有四种:函数、文件、块和函数原型。它们的规则有些复杂(并且还取决于链接,可以是外部的、内部的或无链接),所以我不会全部描述。

    如果你定义一个对象为static,它的生命周期就是程序的整个执行过程。默认情况下,在函数体内声明的普通对象具有自动存储期限。它的生命周期是从程序执行进入它所在的块开始,直到程序执行退出它所在的块。每次执行进入块时,都会创建一个对象的新实例。如您所见,生命周期是在程序运行时应用的属性。

    当您在函数体内声明对象时,声明中的标识符(名称)具有块范围。该名称仅在块内可见。范围是编译时属性;它会影响源代码的哪些部分可以看到名称。例如,如果您的函数 A 在运行时调用函数 B,则函数 B 看不到函数 A 中的名称。即使函数 A 中的对象在函数 B 执行时存在(运行时属性),它们的名称(编译-time 属性)在函数 B 中不可见。

    函数体内的名称具有块作用域,但它可以引用具有自动(块)存储持续时间的对象或具有静态(整个程序)存储持续时间的对象。

    当您在函数体之外声明对象时,其标识符具有文件范围。它对文件中的所有以下源代码都是可见的。

    还有一个属性叫做链接。链接是一种方法,通过该方法可以使不同范围内的相同标识符引用同一对象。 (一个源文件中的foo可以指代同一个对象,就是另一个源文件的foo。)

    【讨论】:

    • Asterisk - static 影响外部范围(其他文件),但不影响内部范围(当前文件0。请务必注意。
    • @RichardJ.RossIII 这称为标识符的链接,而不是范围。
    • @Jens 当然它与链接有关,但完全有可能让 C 没有链接(作为脚本运行),从而使其 external范围更广。
    • @RichardJ.RossIII C 标准在 C99 6.2.1 中明确定义了范围的概念;没有外部范围之类的东西。但是,静态变量存在外部链接,而这正是这里发生的情况。即使是 C 解释器也必须做出相应的行为。
    【解决方案2】:

    y 是一个全局变量,但由于它被声明为static,它只在编译单元中可见,即同一个 C 文件。如果您正在编译多个对象并将它们链接在一起,它将无法从其他单元访问。 在这个简单的示例中,全局变量是否声明为静态无关紧要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      相关资源
      最近更新 更多