GCC不支持简单的整数常量表达式吗?

Pot*_*ter 4 c gcc c99

GCC 4.9和5.1 在全球范围内拒绝这个简单的C99声明.Clang接受了它.

const int a = 1, b = a; // error: initializer element is not constant
Run Code Online (Sandbox Code Playgroud)

怎么可能缺少这样的基本功能?这似乎非常简单.

pax*_*blo 7

C99 1部分6.6 Constant expressions是控制部分.它指出在小节67:

6 /整型常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.

整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分.

整数和浮点常量的定义6.4.4在标准中指定,并且它仅限于实际(文字)而不是变量.

7 /初始值设定项中的常量表达式允许更多纬度.这样的常量表达式应该是或者评估为以下之一(a)算术常量表达式,(b)空指针常量,(c)地址常量,或(d)对象类型的地址常量加上或减去整数常量表达式.

由于a没有这些东西在任一分段67,它不被认为是常量表达式按照标准.

因此,真正的问题不是为什么gcc拒绝它,而是为什么clang接受它,而这似乎被埋在10同一部分的小节中:

10 /实现可以接受其他形式的常量表达式.

换句话说,标准规定了实现必须允许的常量表达式,但不限制实现允许它.


1 C11除了允许_Alignof和使用之外的其他细节之外是相同的sizeof.