硬汉嵌入式论坛

 找回密码
 立即注册
查看: 737|回复: 16
收起左侧

[IAR] IAR不支持数组为0

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-8-28 09:14:13 | 显示全部楼层 |阅读模式
如下图所示IAR编译失败提示        Error[Pe070]: incomplete type is not allowed
有大佬能解决嘛?
下载 (6).png
回复

使用道具 举报

0

主题

43

回帖

43

积分

新手上路

积分
43
发表于 2023-8-28 10:28:44 | 显示全部楼层
填0的意思是这个数组没有数组成员?
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-8-28 10:32:32 | 显示全部楼层
何苦这么做,没啥意义啊?  直接定义u8 def 一样的啊。
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-8-28 11:09:24 | 显示全部楼层
变长数组在单片机平台跑是在给自己挖坑,如果后面需要移植或者做其他事哭都来不及,换个实现方式吧
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-8-28 11:17:54 | 显示全部楼层
确实要用就将C标准设置为C99及其以上,并打开VLA
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2023-8-28 12:53:30 | 显示全部楼层
1. IAR是支持0长度数组的,只是你写的不对
2. 0长度是GNU扩展,标准定义的可变长度写法不同

[C] 纯文本查看 复制代码
struct line {
  int length;
  char contents[0];
};

struct flex  { int length; char data[]; };
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-8-28 13:57:16 | 显示全部楼层
wm20031015 发表于 2023-8-28 10:28
填0的意思是这个数组没有数组成员?

这个数组长度我们用的是宏定义注册的,可能大于0也可能等于0.使用其他编译器都支持编译,就IAR不行
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-8-28 13:57:32 | 显示全部楼层
caicaptain2 发表于 2023-8-28 10:32
何苦这么做,没啥意义啊?  直接定义u8 def 一样的啊。

这个数组长度我们用的是宏定义注册的,可能大于0也可能等于0.使用其他编译器都支持编译,就IAR不行
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-8-28 13:58:02 | 显示全部楼层
庄永 发表于 2023-8-28 11:09
变长数组在单片机平台跑是在给自己挖坑,如果后面需要移植或者做其他事哭都来不及,换个实现方式吧

没办法大佬。代码就是有这样的用法。可变长数组。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-8-28 14:01:59 | 显示全部楼层
庄永 发表于 2023-8-28 11:17
确实要用就将C标准设置为C99及其以上,并打开VLA

我用的是9.20.2版本只用standrd C了
Snipaste_2023-08-28_14-00-06.png
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-8-28 14:15:46 | 显示全部楼层
emwin 发表于 2023-8-28 12:53
1. IAR是支持0长度数组的,只是你写的不对
2. 0长度是GNU扩展,标准定义的可变长度写法不同

调换一下顺序确实可以编译通过了,但是我们的代码就是要为0的在前。我用VScode和QT等编译器都支持这种写法,在IAR这就不支持了。困扰
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-8-28 14:50:24 | 显示全部楼层
小钟嵌入式 发表于 2023-8-28 14:15
调换一下顺序确实可以编译通过了,但是我们的代码就是要为0的在前。我用VScode和QT等编译器都支持这种写 ...

C11和C99的柔性数组不都是在最后吗? 因为这样可以避免内存冲突
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-8-28 15:09:00 | 显示全部楼层
2360985396 发表于 2023-8-28 14:50
C11和C99的柔性数组不都是在最后吗? 因为这样可以避免内存冲突

我用VSCode是支持的写在前面
Snipaste_2023-08-28_15-08-18.png
回复

使用道具 举报

4

主题

38

回帖

50

积分

初级会员

积分
50
发表于 2023-8-28 17:02:33 | 显示全部楼层
小钟嵌入式 发表于 2023-8-28 15:09
我用VSCode是支持的写在前面

那你最好验证下这个支持,仅仅只是没报错而已,结构大小也是常规的内存对齐的结果,截图里的程序基本上啥也没有证明。
另外柔性数组的用处,直接决定了它在数据结构中的位置
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-8-28 17:19:51 | 显示全部楼层
小钟嵌入式 发表于 2023-8-28 13:58
没办法大佬。代码就是有这样的用法。可变长数组。

不要给自己挖坑,肯定有替代方案的
1、整个运行期间,长度只需要改变一次,直接malloc一个就行,反正不用free,不存在什么内存碎片
2、整个运行期间,长度在不断改变,最好使用其他方法来处理;实在不行移植一些性能比较好的内存管理算法比如tlsf这样的,也比这个强
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-8-28 17:20:55 | 显示全部楼层
小钟嵌入式 发表于 2023-8-28 14:01
我用的是9.20.2版本只用standrd C了

这个勾选就足够了,还不能便宜那就要看一下编译器差异了,这个反而说明你使用变长数组的一个大缺陷
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-8-28 17:23:40 | 显示全部楼层
小钟嵌入式 发表于 2023-8-28 15:09
我用VSCode是支持的写在前面

IAR 和 GCC还是有差异的,你要在单片机上面运行的代码想和gcc一样的使用语法,至少得用gcc for arm来变异单片机代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 19:14 , Processed in 0.238989 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表