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)
怎么可能缺少这样的基本功能?这似乎非常简单.
C99 1部分6.6 Constant expressions是控制部分.它指出在小节6和7:
6 /整型常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.
整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分.
整数和浮点常量的定义6.4.4在标准中指定,并且它仅限于实际值(文字)而不是变量.
7 /初始值设定项中的常量表达式允许更多纬度.这样的常量表达式应该是或者评估为以下之一(a)算术常量表达式,(b)空指针常量,(c)地址常量,或(d)对象类型的地址常量加上或减去整数常量表达式.
由于a是没有这些东西在任一分段6或7,它不被认为是常量表达式按照标准.
因此,真正的问题不是为什么gcc拒绝它,而是为什么clang接受它,而这似乎被埋在10同一部分的小节中:
10 /实现可以接受其他形式的常量表达式.
换句话说,标准规定了实现必须允许的常量表达式,但不限制实现仅允许它.
1 C11除了允许_Alignof和使用之外的其他细节之外是相同的sizeof.