海湾合作委员会 4.9 和 5.1reject这个简单的全局范围的 C99 声明。铿锵接受了。
const int a = 1, b = a; // error: initializer element is not constant
这么基本的功能怎么可能少呢?看起来非常简单。
C991 section 6.6 Constant expressions
is the controlling section. It states in subsections 6
and 7
:
6/ 整数常量表达式应具有整数类型,并且只能具有以下操作数:整型常量、枚举常量、字符常量、结果为整型常量的 sizeof 表达式以及作为强制转换的立即操作数的浮点常量.
整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数的一部分。
整数和浮点常量的定义在6.4.4
标准的,并且仅限于实际values(文字)而不是变量。
7/ 初始值设定项中的常量表达式允许有更多的自由度。这样的常量表达式应为以下之一或评估为以下之一(a) 算术常量表达式,(b) 空指针常量,(c) 地址常量,或 (d) 对象类型的地址常量加上或减去整型常量表达式.
Since a
is none任何一小节中的那些事情6
or 7
,根据标准,它不被视为常量表达式。
因此,真正的问题不是为什么gcc
拒绝它,但为什么clang
接受它,并且似乎被埋在小节中10
同一部分的:
10/ 实施may接受其他形式的常量表达式。
换句话说,该标准规定了一个实现must允许常量表达式,但不限制实现only that.
1 C11 is much the same other than minor things like allowing _Alignof
as well as sizeof
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)