【问题标题】:Initialisation during load time vs runtime vs compile-time [duplicate]加载时初始化与运行时与编译时[重复]
【发布时间】:2013-04-17 11:48:54
【问题描述】:

在下面的例子中,我得到一个编译错误

int main() {

    int x = 10; // guess this is runtime initialisation
    static int y = x; //guess this is loadtime initialisation

    printf("x = %d, y = %d", x, y);

}

错误:

    error: initializer element is not constant

我的理解是,这与静态和全局成员相对于自动变量的初始化方式有关。 我想知道加载时间、运行时和编译时初始化之间的区别我还想知道存储在数据部分和堆栈中的元素值及其对初始化的影响。

【问题讨论】:

  • 我认为加载时间和编译时间是一样的。至少从两者都发生在运行时间之前的角度来看。
  • 您应该在提问之前仔细查看您的问题,因为它们可能已经被问及并得到了回答。输入相关关键字([c]staticinitialize 这里),也可以使用 google。

标签: c compiler-errors initialization runtime load-time


【解决方案1】:

我想说,在 C 语言中,编译时和加载时没有区别。 C++ 的情况并非如此:POD 常量在编译时初始化,而具有构造函数的全局/静态对象在加载时初始化。

在您的示例中,您尝试使用运行时变量的内容初始化编译时值,因此失败。在 C++ 中,如果 x 被声明为 const,它将被识别为编译时常量并成功。

【讨论】:

    【解决方案2】:

    静态变量在自动变量之前出现,或者说是局部变量,所以你不能使用任何变量来初始化静态变量你只能使用常量来初始化静态变量。

    加载时初始化和编译时初始化在 C 中是相同的,运行时初始化在 C 中可能不受支持。它在 C++ 中受支持,但我不了解 C

    【讨论】:

    • C 中绝对支持运行时初始化。main() 中的 x 甚至不存在于运行时之外,因此它是在运行时创建和初始化的。
    【解决方案3】:

    常量在编译时初始化,而全局/静态变量在加载时初始化,因此您不能使用运行时堆栈变量在加载时初始化全局/静态变量 如果我们可以将 x 转换为 const(c++) 就可以了。

    【讨论】:

    • 下面的一些答案说“编译时和加载时没有区别”??
    • 是的,在C语言中,代码中加载指令的顺序将在编译时确定
    猜你喜欢
    • 2010-10-16
    • 2012-10-04
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多