首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sdcc不接受代码

sdcc不接受代码
EN

Stack Overflow用户
提问于 2013-01-16 14:00:50
回答 3查看 939关注 0票数 2

我对SDCC有一个问题。我的代码(我正在尝试从另一个编译器移植)使用具有灵活数组成员的结构。但是,当我尝试编译以下代码时:

代码语言:javascript
复制
/** header of string list */
typedef struct {
    int nCount;
    int nMemUsed;
    int nMemAvail;
} STRLIST_HEADER;

/** string list entry data type */
typedef struct {
    int nLen;
    char str[];
} STRLIST_ENTRY;

/** string list data type */
typedef struct {
    STRLIST_HEADER header;
    STRLIST_ENTRY entry[];
} STRLIST;                      // By the way, this is the line the error refers to.

int main()
{
    return 0;
}

SDCC给出以下错误:

代码语言:javascript
复制
$ sdcc -mz80 -S --std-c99 test.c
test.c:18: warning 186: invalid use of structure with flexible array member
test.c:18: error 200: field 'entry' has incomplete type

怎么回事?这段代码在gcc中编译得很好,更不用说我正在使用的其他z80编译器了。

编辑:我找到了this SDCC bug,这似乎是相关的。有没有人能解释一下是不是这样,是怎么回事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-16 14:52:41

SDCC就在那里,而gcc-4.6.2也不能“很好”地编译它。好吧,如果你要求它学究地遵守标准。

使用-std=c99 -pedantic (或-std=c1x -pedantic)编译时,gcc发出

代码语言:javascript
复制
warning: invalid use of structure with flexible array member

和clang-3.0的行为类似,它的警告稍微更具信息性:

代码语言:javascript
复制
warning: 'STRLIST_ENTRY' may not be used as an array element due to flexible array member

该标准在6.7.2.1 (3)中禁止:

结构或联合不应包含具有不完整或函数类型的成员(因此,结构不应包含其自身的实例,但可以包含指向其自身实例的指针),但具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型除外;此类结构(以及任何可能递归地包含此类结构的成员的联合)不应是结构的成员或数组的元素。

(重点是我的)

gcc和clang允许将具有灵活数组成员的struct作为struct的成员,或将数组作为扩展。标准禁止这样做,因此使用该代码的代码是不可移植的,并且每个编译器都有权拒绝该代码。

链接的问题是不相关的,它是关于如果具有灵活数组成员的struct被实例化为automatic时不给出警告,这是标准所不允许的(但被SDCC和其他人作为扩展接受)。

票数 3
EN

Stack Overflow用户

发布于 2013-07-17 15:58:37

想一想为什么这是一个错误。

由于str[]的长度可变,因此STRLIST_ENTRY的大小未知。

STRLIST包含一个可变长度的STRLIST_ENTRY数组。

在内存中,数组是一个紧接在另一个后面的STRLIST_ENTRY序列。

由于其中的元素大小未知,如何知道索引所指向的偏移量?

char str[]应该被赋予一个固定的大小,或者对数组外部的字符串使用char*。

票数 1
EN

Stack Overflow用户

发布于 2021-08-18 14:42:14

我知道我晚了8年:),但也许这对其他人有帮助。下面是在结构末尾使用数据的技巧(例如,当你有一个头,最后一个成员是未知大小的数据时):

代码语言:javascript
复制
typedef struct {
    int nLen;
    char str[0];
} STRLIST_ENTRY;

这将允许您使用索引来寻址字符串中的任何字符,即str[10],并且char *ptr=str也会给出正确的结果。

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

https://stackoverflow.com/questions/14352229

复制
相关文章

相似问题

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