我正在使用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;
}
编译器抛出错误消息:“错误[Pe028]:表达式必须具有常量值”。如果变量被声明为静态或全局,那么这是可以接受的,但在这种情况下我不知道。我用GCC编译器尝试了相同的代码,它工作正常。任何想法?
批评的部分是结构中数据的长度。它说长度必须是恒定的。
答案 0 :(得分:0)
编译器抱怨结构定义带有可变大小的数组。您可以通过在项目选项中将语言从C切换到C ++来实现此目的。你最好的选择可能是开始使用可变大小的数组,但这在很大程度上取决于你实际想要完成的事情。
答案 1 :(得分:0)
在IAR Systems,Embedded Workbench 7.2中,对于iccarm.exe C / C ++编译器,我遇到了同样的问题。当我试图在堆栈上分配一个由函数参数设置的长度时,我得到一个错误[Pe028]。
文档here建议将--vla添加到我的CFLAGS(iccarm.exe - vla ...),这对我有用。
答案 2 :(得分:0)
C标准(我认为在C99之前,虽然有人可能会对此进行纠正)但不允许使用长度作为变量来声明数组。
但是在C / C ++编译器下的项目选项中,Langauge 1选项卡,选择C99& "允许VLA"复选框,你的问题将得到解决。