全局范围内变量和函数的递归依赖 我正在玩我的C++编译器,我注意到一个全局变量的递归依赖性,并且函数调用不被拒绝。例如: #include <iostream> int foo(); int t = foo(); int foo() { std::cout << "Hello before main: " << t << "\n"; t = 10; return t + 10; } int main() { std::cout << "Hello from main.\n"; }
因此,当我使用declare这个全局范围内变量和函数的递归依赖 我正在玩我的C++编译器,我注意到一个全局变量的递归依赖性,并且函数调用不被拒绝。例如: #include <iostream> int foo(); int t = foo(); int foo() { std::cout << "Hello before main: " << t << "\n"; t = 10; return t + 10; } int main() { std::cout << "Hello from main.\n"; },c++,initialization,language-lawyer,C++,Initialization,Language Lawyer,因此,当我使用declare这个t函数时,它依赖于foo函数,这个函数同样依赖于t。C++编译器通过在赋值表达式运行之前基本上有 t>代码> 0来初始化这个循环。 这让我很惊讶。根据标准,这是正确的行为还是我在这里调用了一些未定义的行为?,对象的生命周期被认为是在初始化完成时开始的;在此之前,访问它会导致UB : 。。。类型为T的对象的生存期始于: 获得类型T的正确对齐和尺寸的存储,以及 其初始化(如果有)已完成(包括真空初始化) 在C++20之前,这是一种定义良好的行为。首先执行的是 如中
t
函数时,它依赖于foo
函数,这个函数同样依赖于t
。C++编译器通过在赋值表达式运行之前基本上有<代码> t>代码> 0来初始化这个循环。
这让我很惊讶。根据标准,这是正确的行为还是我在这里调用了一些未定义的行为?,对象的生命周期被认为是在初始化完成时开始的;在此之前,访问它会导致UB
:
。。。类型为T
的对象的生存期始于:
- 获得类型
的正确对齐和尺寸的存储,以及T
- 其初始化(如果有)已完成(包括真空初始化)
(自C++14以来)
都是零初始化的。如果非类非局部变量的定义没有初始值设定项,则默认初始化不执行任何操作,而不修改早期零初始化的结果
从标准上看,
如果未执行常量初始化,则具有静态存储持续时间()或线程存储持续时间()的变量初始化为零()。零初始化和常量初始化统称为静态初始化;所有其他初始化都是动态初始化。所有静态初始化都强烈地发生在()任何动态初始化之前
@语言律师我不太确定,但这是否意味着
t
的生命周期只有在所有初始化(包括本例中的零初始化和复制初始化)完成时才开始?目前它的意思是在动态初始化完成之前访问对象是UB,但IIUC这被认为是一个缺陷。
Hello before main: 0
Hello from main.