代码之家  ›  专栏  ›  技术社区  ›  infinite

文件范围内的变量没有使用其他变量初始化

c
  •  0
  • infinite  · 技术社区  · 6 年前

    有人能解释一下为什么这个底层代码在寻找 常数 初始化值?在函数中执行相同的操作不会造成任何问题(即使另一个变量(在本例中是b)是常量)。

    #include<stdio.h>
    
    int a=9;
    int b=a;
    
    int main()
    {
       return 0;
    }
    

    刚才有人问了一个类似的问题(不知道怎么问),但答案只是因为语言的设计规范说明了这一点(这一点没有帮助),有人能解释一下这样做的目的吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Eric Postpischil    6 年前

    这个 a b 显示的对象具有静态存储持续时间,这意味着它们存在于程序的整个执行过程中。2011年版的C标准(草案N1570)第6.7.9条第4款规定:“对于具有静态或线程存储持续时间的对象,初始化器中的所有表达式都应为常量表达式或字符串文本。”

    c没有任何规定计算静态对象的初始值。它们的值需要在编译时确定,或者 可重定位地址 可由链接器或加载程序计算的。可重定位地址被计算为简单表达式,这些表达式是将程序的部分加载到存储器中的函数。

    函数中声明的对象(技术上,内部块,在函数定义内) extern static 具有自动存储持续时间。C标准允许用运行时计算的表达式初始化这些标准。编译器实现这一点相对容易,因为它们只需在函数的开头放置代码来计算值。

    从理论上讲,C标准可以允许您在运行时计算静态值的初始化静态对象,并且实现可以通过包含在前面执行的代码来实现。 main . 其他编程语言也有这样的特性。然而,它也带来了一些并发症。例如,如果你写 extern int b; int a = 3*b; 在一个源文件中 extern int a; int b = a+4; 在另一种情况下,哪个人应该先被处决?如何编写语言规则来禁止这种情况?也许有办法解决这个问题和其他问题,但是C语言是在语言发展还很年轻的时候就开始的,它避免了像这样的复杂问题。