为什么在线编译器拒绝这个VLA代码,而本地Apple clang却不拒绝?

qojgxg4l  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(169)

我正在做一个练习,在这个练习中,我必须证明C和C常量表达式之间的区别。在C中写这样的东西是有效的:

const int size_1 = 2;
const int size_2 = 2;

const int arr[size_1 + size_2] = { 1, 2, 3, 4 };

int main() {
  return arr[0];
}

但我预计它会在复制到.c文件并在C中编译时抛出错误-事实上,我已经使用在线编译器检查它,它返回:

main.c:6:11: error: variably modified ‘arr’ at file scope

我相信这就是我要找的
但是当我在我的机器上用命令gcc main.c编译完全相同的代码时,代码编译没有错误,返回的值是正确的。有人能解释一下我的错误在哪里吗?
我的编译器版本:

Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin23.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
zkure5ic

zkure5ic1#

.代码编译没有错误.
(a)C标准不要求编译器发出诊断消息或拒绝使用C标准未定义的常量形式的程序(或拒绝具有未定义行为的程序)。该标准要求程序在违反语法规则和明确列为约束的规则时发出诊断消息(根据C 2018 5.1.1.3 1),但在数组大小表达式中使用const变量并不违反。对于其他违反标准中“要求”的情况,标准没有定义必须发生什么(C 2018 4 2),一个实现可能会接受这样的程序(C 2018 4 6)。
(b)C标准明确允许实现接受其他形式的常量表达式(C 2018 6.6 10,“实现可以接受其他形式的常量表达式”)。
(c)Testing with Clang 15.0.0 for ARMv8 on Compiler Explorer即使使用默认编译器选项也会产生消息“variable length array folded to constant array as an extension [-Wgnu-folding-constant]”。我没有对Clang 15.0.0的苹果版本进行测试,所以,如果你没有看到这条消息,这似乎是苹果版本的差异。添加开关-std=c18 -pedantic-errors可能会导致编译器拒绝此代码。

相关问题