C中不支持可变长度数组C99(Variable length arrays C99 not supported in C)

在Visual Studio 2005中,我正在尝试编译.c文件:

int i = 6;

int a[i];

它不起作用,我的编译器遵循哪个标准?

In Visual Studio 2005, I'm trying to compile a .c file:

int i = 6;

int a[i];

It doesn't work, so which standard does my compiler follow?

原文:https://stackoverflow.com/questions/7871019

更新时间:2020-01-28 08:02

最满意答案

Visual Studio仅支持C89 / 90。 他们不支持C99。 因此,您无法在Visual Studio中使用可变长度数组。 此外,Microsoft没有计划在其C编译器中添加对C99的支持。

Visual Studio only supports C89/90. They have no support for C99. Therefore you cannot use variable-length arrays in Visual Studio. Furthermore, Microsoft has no plans to add support for C99 in their C compiler.

2011-10-24

相关问答

您遇到的问题是gdb的错误(或者可能更准确地说是缺少的功能)。 gdb无法正确处理应用于VLA(可变长度数组)的sizeof运算符。 来自gdb邮件列表的此消息表明,已在gdb实现了对VLA上sizeof支持,但仅在最近才实现。 显然它不在你和我都使用的版本中(gdb 7.7.1)。 如果没有这个修复,它会错误地将VLA的大小打印为0.您的代码本身应该正常运行; 它只是gdb没有正确处理它。 你的代码没有什么特别的错误,只要(a)它是用支持VLA的编译器编译的,并且(b)数组的大小是正的而不是太大

...

阅读man printf字段宽度的*占位符。 printf("%0*d", 3, 42);

给 042

和 printf("% *s", 42, "alk");

给 <39 spaces>alk

Read about the * place holder for the field width in man printf. printf("%0*d", 3, 42);

gives 042

and printf("% *s", 42, "alk");

gives <39 spaces>

...

如果你想编写可移植的C代码,那么我建议你用C89(旧的ANSI C标准)编写。 大多数编译器支持此标准。 英特尔C编译器具有非常好的C99支持,并且可以生成快速的二进制文件。 (谢谢0x69 !) MSVC支持一些新功能 ,Microsoft计划在未来的版本中扩大支持。 GCC支持C99的一些新事物。 他们创建了一个关于C99功能状态的表格。 C99最有用的特性可能是可变长度阵列,GCC现在支持它。 Clang (LLVM的C前端)支持除浮点编译指示之外的大多数功能。 维基百科似乎有一个很好的总结

...

两个原因: C ++基于C89(1989年发布的C标准)。 VLA仅在C99中引入。 C ++有std::vector<>和一大堆其他容器,这就是为什么我相信C ++永远不会打扰到VLA。 当VLA被发明用于C时,它已经拥有了它们。 Two reasons: C++ is based on C89 (the C standard as published in 1989). VLAs were only introduced in C99. C++ has std::vector<> and a

...

从标准的角度来看,试图分配VLA的实施不能调用未定义行为的大小。 因为标准没有提供发现实现可以安全创建什么大小的数组的方法,并且没有要求实现允许任何特定的大小,所以任何创建大于1的VLA对象的尝试都应该被视为调用未定义的行为,除了在这种情况下,人们对实现的内部工作足够了解,以确定它将能够处理的VLA的大小。 如果malloc()不可用,那么最好的办法可能是定义一个具有最粗对齐要求的任何类型的大数组,将其地址存储到volatile限定指针中[指针本身所在的存储应该因此被限定]读取它回来,并将其解释为

...

C99标准支持可变长度数组 。 这些数组的长度在运行时确定。 The C99 standard supports variable length arrays. The length of these arrays is determined at runtime.

您的原始代码对于我的消息很不好,例如: void foo7(int n, double ARRAY_RESTRICT a[n], const double ARRAY_RESTRICT b[n], const double ARRAY_RESTRICT c[n])

^

restrict.c:126:1: error: invalid use of ‘restrict’

restrict.c:126:1: error: invalid use of ‘restrict’

restrict.c:1

...

Visual Studio仅支持C89 / 90。 他们不支持C99。 因此,您无法在Visual Studio中使用可变长度数组。 此外,Microsoft没有计划在其C编译器中添加对C99的支持。 Visual Studio only supports C89/90. They have no support for C99. Therefore you cannot use variable-length arrays in Visual Studio. Furthermore, Micro

...

来自C11规范§6.10.8.3 以下宏名称由实现有条件地定义: [...] __STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组或可变修改类型。 因此,如果__STDC_VERSION__ > 201000L ,则需要检查__STDC_NO_VLA__ 。 否则,如果__STDC_VERSION__ >= 199901L VLA应该可以工作,但如果编译器不兼容,您将收到编译时错误。 From the C11 specification §6.10.8.3 The follow

...

在C ++中,你将使用void func(Matrix const& A) 。 尺寸将在矩阵本身中编码,因此不需要单独传递它们。 这既保证了尺寸的准确性,又简化了调用习语。 In C++, you'd do void func(Matrix const& A). The dimensions would be encoded in the matrix itself, so there'd be no need to pass them separately. This both ensures

...

linux c99 可变长数组,C中不支持可变长度数组C99(Variable length arrays C99 not supported in C)...相关推荐

  1. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

  2. 求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序

    已知数据文件IN14.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中.请编制一个函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此 ...

  3. 数组x中数据复制到数组y中,重复的数据只存储一次,最后输出y;计算x中数据的平均值ave及大于平均值的元素个数n。c++实现

    题目描述 编程序,实现如下功能: (1)定义两个一维数组x,y,不超过50个元素. (2)从键盘输入k个整数到数组x中. (3)计算x中数据的平均值ave及大于平均值的元素个数n并输出. (4)将数组 ...

  4. java不等长二维数组_Java中关于二维数组的理解与使用

    今天练习的时候遇到一个题目,题目需求是这样的: 需求说明: 根据3个班各5名学生某门课程的成绩,正确使用二维数组计算如图所示3个班各自的总成绩 分析: 要实现这个功能需要存储两个信息: 一个是班级信息 ...

  5. c语言定义可变长度的数组,有没有办法在c中创建一个可变长度数组全局?

    我在一个函数中创建了一个可变长度数组,但是我需要在第二个函数中引用这个数组.当我将声明置于main()之上时,问题就出现了,因为它的长度尚未定义,我的编译器生气了. 人们通常如何解决这个问题? 编辑: ...

  6. python构建二维数组_Python中创建二维数组

    二维数组 二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等的矩阵称为方阵.对称矩阵a[i] ...

  7. java 申请不定长度数组_java中申请不定长度数组ArrayList的方法

    如下所示: import java.util.ArrayList; //java中申请不定长度数组 public class Test01 { public static void main(Stri ...

  8. php7 对象转数组,php7中为对象/关联数组进行解构赋值

    在CoffeeScript,Clojure,ES6和许多其他语言中,我们对对象/贴图/等进行了解构,如下所示: obj = {keyA: 'Hello from A', keyB: 'Hello fr ...

  9. scala中的二维数组_Scala中的多维数组

    scala中的二维数组 多维数组 (Multi-dimensional arrays) An Array that stores data in the form multidimensional m ...

最新文章

  1. JS 数组A有数组B的数据就删除
  2. 12C expdp issue
  3. 其他算法-高斯混合模型
  4. seq2seq中的beam search算法过程
  5. Python Revisited Day 07 (文件处理)
  6. Linux xargs命令
  7. 由于远程桌面服务当前正忙|VDI无法连接
  8. oracle入库的速度能到多少_多线程能提高Oracle的入库速度吗
  9. SRE 是如何保障稳定性的
  10. 英特尔成立集成光电研究中心 加速光互连I/O创新
  11. Linux升级ssh、ssl
  12. 搜索场 day1 A 求和
  13. 冯诺依曼体系结构与计算机基本组成
  14. 屏幕镜像显示无法连接服务器,苹果屏幕镜像连接失败原因
  15. 【搞船日记】【Shapr3D的STL格式转Gcode】
  16. Linux服务器重启导致数据丢失问题解决
  17. 浏览器的窗口大小被改变时触发的事件window.onresize
  18. 论文阅读:Transformer-Based Neural Network for Answer Selection in Question Answering
  19. adb模拟按键home_adb 命令模拟按键事件 模拟 点击 事件
  20. 【深度思考,极客大学Java进阶训练营

热门文章

  1. (剑指Offer)面试题55:字符流中第一个不重复的字符
  2. Linux下后台执行java程序
  3. IOS开发(63)之GCD执行延迟操作
  4. 利用Boost影响Lucene查询结果的排序
  5. 14、查找最接近的元素
  6. 学习Python的利器:内置函数dir()和help()
  7. 设计模式 C++抽象工厂模式
  8. 第一步:python下PyGame的下载与安装
  9. axure选中状态的值_关于编写Axure的心得
  10. 讯飞输入法pad版x86_讯飞搜狗为何抵不过百度输入法?读完你就明白了