我正在阅读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 */
您将得到相同的错误:尝试初始化静态对象 用非常数
我同意他的回答。我还尝试了一个简单的例子,例如关于gcc 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
编译?是什么原因?
答案 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