我对SDCC有一个问题。我的代码(我正在尝试从另一个编译器移植)使用具有灵活数组成员的结构。但是,当我尝试编译以下代码时:
/** 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给出以下错误:
$ 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,这似乎是相关的。有没有人能解释一下是不是这样,是怎么回事?
发布于 2013-01-16 14:52:41
SDCC就在那里,而gcc-4.6.2也不能“很好”地编译它。好吧,如果你要求它学究地遵守标准。
使用-std=c99 -pedantic (或-std=c1x -pedantic)编译时,gcc发出
warning: invalid use of structure with flexible array member和clang-3.0的行为类似,它的警告稍微更具信息性:
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和其他人作为扩展接受)。
发布于 2013-07-17 15:58:37
想一想为什么这是一个错误。
由于str[]的长度可变,因此STRLIST_ENTRY的大小未知。
STRLIST包含一个可变长度的STRLIST_ENTRY数组。
在内存中,数组是一个紧接在另一个后面的STRLIST_ENTRY序列。
由于其中的元素大小未知,如何知道索引所指向的偏移量?
char str[]应该被赋予一个固定的大小,或者对数组外部的字符串使用char*。
发布于 2021-08-18 14:42:14
我知道我晚了8年:),但也许这对其他人有帮助。下面是在结构末尾使用数据的技巧(例如,当你有一个头,最后一个成员是未知大小的数据时):
typedef struct {
int nLen;
char str[0];
} STRLIST_ENTRY;这将允许您使用索引来寻址字符串中的任何字符,即str[10],并且char *ptr=str也会给出正确的结果。
https://stackoverflow.com/questions/14352229
复制相似问题