小钟嵌入式 发表于 2023-8-28 09:14:13

IAR不支持数组为0

如下图所示IAR编译失败提示      Error: incomplete type is not allowed
有大佬能解决嘛?

wm20031015 发表于 2023-8-28 10:28:44

填0的意思是这个数组没有数组成员?

caicaptain2 发表于 2023-8-28 10:32:32

何苦这么做,没啥意义啊?直接定义u8 def 一样的啊。

庄永 发表于 2023-8-28 11:09:24

变长数组在单片机平台跑是在给自己挖坑,如果后面需要移植或者做其他事哭都来不及,换个实现方式吧

庄永 发表于 2023-8-28 11:17:54

确实要用就将C标准设置为C99及其以上,并打开VLA

emwin 发表于 2023-8-28 12:53:30

1. IAR是支持0长度数组的,只是你写的不对
2. 0长度是GNU扩展,标准定义的可变长度写法不同


struct line {
int length;
char contents;
};

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

小钟嵌入式 发表于 2023-8-28 13:57:16

wm20031015 发表于 2023-8-28 10:28
填0的意思是这个数组没有数组成员?

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

小钟嵌入式 发表于 2023-8-28 13:57:32

caicaptain2 发表于 2023-8-28 10:32
何苦这么做,没啥意义啊?直接定义u8 def 一样的啊。

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

小钟嵌入式 发表于 2023-8-28 13:58:02

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

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

小钟嵌入式 发表于 2023-8-28 14:01:59

庄永 发表于 2023-8-28 11:17
确实要用就将C标准设置为C99及其以上,并打开VLA

我用的是9.20.2版本只用standrd C了

小钟嵌入式 发表于 2023-8-28 14:15:46

emwin 发表于 2023-8-28 12:53
1. IAR是支持0长度数组的,只是你写的不对
2. 0长度是GNU扩展,标准定义的可变长度写法不同



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

2360985396 发表于 2023-8-28 14:50:24

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

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

小钟嵌入式 发表于 2023-8-28 15:09:00

2360985396 发表于 2023-8-28 14:50
C11和C99的柔性数组不都是在最后吗? 因为这样可以避免内存冲突

我用VSCode是支持的写在前面

The_One 发表于 2023-8-28 17:02:33

小钟嵌入式 发表于 2023-8-28 15:09
我用VSCode是支持的写在前面

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

庄永 发表于 2023-8-28 17:19:51

小钟嵌入式 发表于 2023-8-28 13:58
没办法大佬。代码就是有这样的用法。可变长数组。

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

庄永 发表于 2023-8-28 17:20:55

小钟嵌入式 发表于 2023-8-28 14:01
我用的是9.20.2版本只用standrd C了

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

庄永 发表于 2023-8-28 17:23:40

小钟嵌入式 发表于 2023-8-28 15:09
我用VSCode是支持的写在前面

IAR 和 GCC还是有差异的,你要在单片机上面运行的代码想和gcc一样的使用语法,至少得用gcc for arm来变异单片机代码
页: [1]
查看完整版本: IAR不支持数组为0