据我所知,ISO C标准对C11 6.7.9中具有静态存储持续时间的对象的初始化程序严格要求
具有静态或线程存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字。
但是GCC / Clang都接受了以下代码:
const int i = 3; // const here should not make i a constant expression
static int j = i;
即使使用-Wall -Wextra -Werror -pedantic-errors
,上述编译器也没有给我任何抱怨。我在这里弄错了吗?
您什么都没错过,它确实是一个不合格的C程序,并且在编译器方面也不合格。这很可能是因为GCC和Clang都是C ++的编译器套件。在C ++中,i
是j
的有效初始化器。
但是值得注意的是,编译器可以自由地翻译不合格的C程序,但是它们必须根据C11 5.1.1.3 p1发出不合格的诊断信息:
符合的实现应至少产生一个诊断消息(以实现定义的方式标识),如果预处理翻译单元或翻译单元包含一个违反任何语法规则或约束,即使行为是也明确指定为未定义或实现定义。在其他情况下,不需要生成诊断消息。
即使我们接受此行为作为扩展,GCC和Clang都不会发出诊断的事实是这两个部分都存在一致性错误。