首页 文章

什么时候全局变量的初始化发生?

提问于
浏览
2

我知道程序运行时,首先执行main()函数 . 但是什么时候在main()之外声明的全局变量的初始化发生了?我的意思是如果我声明一个这样的变量:

unsigned long current_time = millis();

void main() {
    while () {
        //some code using the current_time global variable 
    }
}

这里,全局变量初始化的确切时间很重要 . 请告诉我在这种情况下会发生什么 .

2 回答

  • 3

    既然你没有定义你所说的语言,我认为它是C语言 .

    在计算机编程中,全局变量是可在每个范围内访问的变量(除非被遮蔽) . 具有全局变量的交互机制称为全局环境(另请参见全局状态)机制 . 全局环境范例与本地环境范例形成对比,其中所有变量都是本地的,没有共享内存(因此所有交互都可以重新配置为消息传递) . 维基百科 .


    原则上,在调用main()之前初始化在任何函数外部定义的变量(即全局,名称空间和类静态变量) . 翻译单元中的此类非本地变量按其声明顺序初始化(第10.4.9节) . 如果此类变量没有显式初始值设定项,则默认情况下将其初始化为其类型的默认值(第10.4.2节) . 内置类型和枚举的默认初始化值为0. [...]在不同的转换单元中没有保证全局变量初始化的顺序 . 因此,在不同编译单元中创建全局变量的初始值设定项之间的顺序依赖关系是不明智的 . 此外,无法捕获全局变量初始化程序抛出的异常(第14.7节) . 通常最好最小化全局变量的使用,特别是限制使用需要复杂初始化的全局变量 . 看到 .

  • 2

    (快速回答:C标准不支持这种初始化;您必须查阅编译器的文档 . )

    现在我们知道语言是C,我们可以看到标准对它的看法 .

    C99 6.7.8第4段:

    具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字 .

    新的2011年标准(至少是我的草案)说:

    具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字 .

    因此,使用函数调用初始化静态对象(例如,诸如 current_time 之类的全局对象)是违反约束的 . 编译器可以拒绝它,或者它可以接受警告,并且如果它提供语言扩展,则执行它喜欢的任何操作 .

    C标准不允许这种初始化 . 基本上,在 main() 函数开始执行之前,您的代码都不能执行 .

    显然你的编译器允许它作为扩展(假设你实际编译了这段代码) . 您必须查阅编译器的文档以了解语义是什么 .

    (通常 main 被声明为 int main(void)int main(int argc, char *argv[]) 或等效,或者以某种实现定义的方式 . 在许多情况下 void main() 表示程序员以他们喜欢的任何方式输入入口点 . 因为你可能使用了一个独立的实现,你应该声明 main() 然而编译器的文档告诉你 . )

相关问题