首页 >后端开发 >C++ >`int size = 10;` 是 C 中的常量表达式:编译器兼容性问题吗?

`int size = 10;` 是 C 中的常量表达式:编译器兼容性问题吗?

Patricia Arquette
Patricia Arquette原创
2024-12-09 22:08:15873浏览

Is `int size = 10;` a Constant Expression in C  : A Compiler Compatibility Issue?

是否“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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn