是否“int size = 10;”生成常量表达式?
下面的代码片段在 gcc 4.8 和 Clang 3.2 中成功编译:
int main() { int size = 10; int arr[size]; }
根据 C 标准 (8.3.4/1),数组的大小必须是整型常量表达式。然而,代码中的“size”似乎不是一个整型常量表达式。这是编译器错误还是我们理解中的疏忽?
Visual Studio C 拒绝此代码并显示消息:“错误 C2466:无法分配常量大小为 0 的数组”。这意味着编译器认为“大小”为零。
说明
gcc 和 Clang 支持 可变长度数组 (VLA) 作为C 中的扩展。 VLA 是一项 C99 功能,允许在运行时确定数组的大小。在代码片段中,“size”是在编译时确定的,但它不是字面常量。因此,“size”在 gcc 和 Clang 中被视为 VLA。
另一方面,Visual Studio 不支持 VLA 并遵守 C 标准。结果,它拒绝代码,因为“size”不是文字常量。
标准合规性
C 标准定义了一个积分常量表达式 作为一个表达式,在求值时会产生整型或无作用域枚举类型的纯右值。在本例中,“size”使用文字值 (10) 进行初始化,这使其成为整型常量表达式。
在 gcc 和 Clang 中使用“-pedantic”标志将生成有关可变长度数组的警告在代码片段中。使用“-pedantic-errors”将使警告成为错误。
解决方案
为了符合 C 标准,“size”可以声明为 const 或constexpr 整数:
const int size = 10;
或
constexpr int size = 10;
以上是`int size = 10;` 是 C 中的常量表达式:编译器兼容性问题吗?的详细内容。更多信息请关注PHP中文网其他相关文章!