C - 编译器允许的语法无效?

标签 c cmake clion

当我使用 Microsoft Visual Studio 学习 C 时,它不允许我创建具有非常量大小的数组。我必须要么输入一个像 int arr[5]; 这样的值,要么执行 #define size 5 并执行 int arr[size];。但是今天使用 Clion,我注意到它允许我执行以下操作:

#include <stdio.h>

int main()
{
    printf("Enter a value: ");
    int x;
    scanf("%d", &x);

    int arr2[x];
    for (int i = 0; i < x; i++)
    {
        arr2[i] = i;
        printf("Array at %d is %d.\n", i, arr2[i]);
    }
    return 0;
}

此 C 代码编译和运行没有任何问题——没有段错误或任何问题。这是怎么回事?这是合法的 C 代码,我只是在一个不允许它的 IDE 中学习,还是这个无效的 C 代码,我只是使用了一个错误的编译器?在我使用 Linux 的另一台计算机上,我什至安装了 GCC 7.2,并且允许使用相同的语法。我不明白。这是 CLion 问题、CMake 问题还是 C 语言问题?

下面列出了我的编译器和 CMake。谢谢。

enter image description here

最佳答案

这是有效的 C。它被称为可变长度数组 (VLA)。此功能已作为 C99 标准的一部分添加到语言中。

众所周知,MSVC 不支持许多 C99 及更高版本的功能,包括 VLA。

关于C - 编译器允许的语法无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375731/

相关文章:

c++ - Clion 警告 glm::dot returnType 但无论如何编译

c - 为什么 "do ... while (0)"不能用简单的大括号代替?

c++ - 在不使用 Arduino 中的 String 对象的情况下将二进制数据转换为其等效的 ASCII

C#:函数求值顺序(相对于 C)

c++ - 使用 ctest 时,每个测试都需要单独的文件吗?

GDB + CLion + STM32f4 + OpenOCD -> gdb 错误,远程 'g' 数据包中的寄存器 16 被截断

c - 为什么 printf 不在控制台上打印 "operator"?

ubuntu - CMake 错误 : CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM 未设置。在 Ubuntu 中

visual-studio - C测试,VS2010。如何摆脱 Nightly、NightlyMemCheck 等?

multithreading - OpenMP不会使用所有线程/Clion/Windows