0

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

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

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

4

3 回答 3

0

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

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

于 2013-04-17T11:56:29.697 回答
0

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

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

于 2013-04-17T11:57:01.410 回答
0

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

于 2013-04-17T12:22:08.017 回答