【问题标题】:Lifetime of "extern" variable in C?C中“外部”变量的生命周期?
【发布时间】:2016-07-11 09:26:04
【问题描述】:

如果声明为extern int p;,变量p的生命周期是多少

它是静态的、动态的、自动的还是因为没有链接而没有生命周期?

【问题讨论】:

  • 生命周期是静态的。
  • @i486:请不要在 cmets 部分回答。
  • @LightnessRacesinOrbit 答案部分需要更多字词 :)
  • @i486:是的,这将是一个非常短(太短!)的答案。不过,它不属于 cmets!评论没有经过同行评审或质量控制,当有人像您一样发布错误答案时,这是一个问题:)

标签: c extern lifetime


【解决方案1】:

谈论由extern 声明引入的名称的生命周期没有多大意义 - 存储持续时间是对象的属性,而不是名称的属性。

另一方面,extern 变量声明只能引用全局变量,该变量具有静态存储持续时间。

【讨论】:

    【解决方案2】:

    或者它没有生命周期,因为没有链接?

    关键字extern 表示只声明了一个变量,即不为其分配存储空间[1]。

    关键字extern 与变量的生命周期无关。也就是说,变量的生命周期/范围仅取决于它在代码中的确切位置。

    注意

    [1] 当extern 与类似的赋值一起使用时

    extern int i=5; 
    

    关键字extern 被忽略,通常的范围规则适用于变量

    [2] 请在此查看我的其他[ answer ]


    有趣:正如 Stephen Prata 在他的《C++ Primer Plus》一书中所说,关键字extern 的意思是“使用之前在外部定义的这个名称的变量”

    【讨论】:

    • 您说变量的生命周期仅取决于它在代码中的确切位置。然后,这意味着如果变量在某个函数中声明,它具有自动生命周期。其他人的回答表明 extern 变量具有静态生命周期。那么,它不必只是静态生命周期?
    • @lightness-races-in-orbit :我的意思是declared-only。但谢谢这是有道理的。
    • @display_error:没有“外部变量”这样的东西,其他答案确实这么说。
    • @sjsam 如果 extern int p;在某个函数中声明?
    • @display_error :这大致意味着您正在借用p,它在您的代码中的其他地方声明。例如,如果p 在所有函数之外定义,那么它的生命周期将持续到程序完成。但是您对 p 所做的更改也会影响它的值..
    【解决方案3】:

    C11 草案第 6.2.4 节说

    一个对象,其标识符在没有存储类说明符的情况下声明 _Thread_local,可以使用外部或内部链接,也可以使用存储类 说明符static,具有静态存储持续时间。它的生命周期是整个执行 程序及其存储的值仅在程序启动之前初始化一次。

    【讨论】:

    • 不错。作为旁注,关键字static 仅用于链接,除非在block scope 中使用。
    【解决方案4】:

    程序的生命周期。在加载时或程序启动时初始化一次。默认初始值为 0。不能在块内初始化。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2012-05-19
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 2012-05-19
      • 2015-08-01
      相关资源
      最近更新 更多