【问题标题】:EWARM compilation error - expression must have a constant valueEWARM 编译错误 - 表达式必须具有常量值
【发布时间】:2013-10-22 13:53:30
【问题描述】:

我正在使用 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 编译器尝试了相同的代码,它运行良好。有人有什么想法吗?

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

【问题讨论】:

  • 欢迎来到 SO!错误是否指向特定的代码行?

标签: iar


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 刚刚注意到这个问题是 3.5 岁。我希望他们已经解决了这个问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2014-10-21
      • 2021-12-02
      • 2012-07-27
      • 2021-08-05
      • 2022-12-17
      相关资源
      最近更新 更多