首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EWARM编译错误-表达式必须具有常量值

EWARM编译错误-表达式必须具有常量值
EN

Stack Overflow用户
提问于 2013-10-22 21:53:30
回答 3查看 1.7K关注 0票数 0

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

代码语言:javascript
复制
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;
}

编译器抛出错误消息:"ErrorPe028: expression必须有一个常量值“。如果变量声明为静态或全局,这是可以接受的,但在这种情况下,我不知道。我用GCC编译器尝试了相同的代码,它工作得很好。有人有什么想法吗?

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

EN

回答 3

Stack Overflow用户

发布于 2013-10-25 05:00:18

编译器正在抱怨具有可变大小的数组的结构定义。您可以通过在项目选项中将您的语言从C切换到C++来实现这一点。最好的办法是首先使用可变大小的数组,但这在很大程度上取决于您实际要完成的任务。

票数 0
EN

Stack Overflow用户

发布于 2017-03-22 06:44:43

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

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-22 16:33:34

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19519900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档