为什么允许在这里使用非const初始化静态变量?

时间:2015-06-21 08:13:53

标签: c gcc initialization const static-variables

我正在阅读this。 @Andrei T的第一个答案是

  

“大”对象永远不会是C中的常量表达式,即使是   object被声明为const。 Const限定对象(任何类型)都是   不是C语言术语中的常量。它们不能用于   具有静态存储持续时间的对象的初始化器,无论如何   他们的类型。

     

例如,这不是常数

const int N = 5; /* `N` is not a constant in C */
     

上述N在C ++中是常量,但在C中不是常数。   所以,如果你尝试做

static int j = N; /* ERROR */
     

您将得到相同的错误:尝试初始化静态对象   用非常数

我同意他的回答。我还尝试了一个简单的例子,例如关于gc​​c 4.8.2& 4.9.2&它给出了我预期的编译器错误:

#include <stdio.h>
int main(void)
{
    const int a=5;
    static int b=a;
    printf("%d",b);
}

但是当我在ideone.com上尝试时,它会编译和放大运行良好并给出预期的结果。查看实时演示here。此外,在代码块13.12 IDE(gcc 4.7.1)上,这个程序运行正常。那么,它是编译器错误还是gcc扩展?编译器选项ideone的哪些组合使用?那么,&amp;为什么它在ideone编译?是什么原因?

2 个答案:

答案 0 :(得分:3)

这似乎是一个gcc专业。使用-std=c89-pedantic进行编译会报告错误。

由于在所有C标准中都存在约束违规,因此不对该情况进行诊断会使得没有-std=c??选项之一的gcc成为不合格的编译器。

答案 1 :(得分:2)

这是因为ideone 可能使用gcc选项调用-O(优化级别1)。即使是gcc的旧版本(我的是4.4.7)也是如此:

$ gcc -ansi main.c 
main.c: In function ‘main’:
main.c:6: error: initializer element is not constant
$ gcc -ansi -O main.c
$ echo $?
0

这里有趣的是-pedantic它再次正常工作并且需要诊断消息(仅使用4.4.7, see Keith's comment 进行测试) :

gcc -ansi -pedantic -O main.c 
main.c: In function ‘main’:
main.c:6: error: initializer element is not constant
$ echo $?
1