0

我正在使用 IAR Systems 的 EWARM 6.6 并得到以下我无法解释的编译错误。

void testFunc(uint8_t* buf, uint8_t length)
{
  struct
  {
    uint8_t start;
    uint8_t data[length];
    uint8_t stop;
  }longframe;
  longframe.start = 1;
  memcpy( longframe.data, buf, length );
  longframe.stop = 2;
}

编译器抛出错误消息:“Error[Pe028]: expression must have a constant value”。如果将变量声明为静态或全局变量,这是可以接受的,但在这种情况下,我不知道。我用 GCC 编译器尝试了相同的代码,它运行良好。有人有什么想法吗?

被批评的部分是结构内数据的长度。它说长度必须是恒定的。

4

3 回答 3

0

编译器抱怨具有可变大小数组的结构定义。您可以通过在项目选项中将语言从 C 切换到 C++ 来完成此操作。您最好的选择可能是一开始就使用可变大小的数组,但这在很大程度上取决于您实际尝试完成的任务。

于 2013-10-24T21:00:18.193 回答
0

C标准(我认为在C99之前,尽管有人可能会纠正我)不允许将数组声明为长度为变量。

但是,在 C/C++ 编译器下的项目选项中,语言 1 选项卡中,选择 C99 和“允许 VLA”复选框,您的问题将得到解决。

于 2017-03-22T08:33:33.517 回答
0

在 IAR Systems, Embedded Workbench 7.2 中,对于 iccarm.exe C/C++ 编译器,我遇到了同样的问题。尝试在堆栈上分配长度由函数参数设置的数组时,出现错误 [Pe028]。

这里的文档建议将 --vla 添加到我的 CFLAGS (iccarm.exe --vla ...),这对我有用。

于 2017-03-21T22:44:42.663 回答