在加载时间与运行时间与编译时间之间初始化

时间:2013-04-17 11:48:55

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

在下面的例子中,我在编译时遇到错误

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

加载时间初始化和编译时初始化在C中是相同的,并且C中可能不支持运行时初始化。在C ++中支持但是我不知道C

答案 2 :(得分:0)

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