sdcc不接受代码
我对SDCC有意见。我的代码(我正试图从另一个编译器移植)使用具有灵活数组成员的结构。但是,当我尝试编译以下代码时:sdcc不接受代码,c,compiler-construction,z80,sdcc,C,Compiler Construction,Z80,Sdcc,我对SDCC有意见。我的代码(我正试图从另一个编译器移植)使用具有灵活数组成员的结构。但是,当我尝试编译以下代码时: /** header of string list */ typedef struct { int nCount; int nMemUsed; int nMemAvail; } STRLIST_HEADER; /** string list entry data type */ typedef struct { int nLen; cha
/** 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编译器了
编辑:我发现这似乎是相关的。有人能解释一下它是不是以及如何实现的吗?SDCC就在那里,gcc-4.6.2也不能“很好”地编译它。好吧,如果你要求它学究式地遵守标准 使用
-std=c99-pedantic
(或-std=c1x-pedantic
)编译时,gcc会发出
警告:使用灵活数组成员的结构无效
而clang-3.0的行为也类似,它的警告信息稍微多一些:
警告:“STRLIST_ENTRY”不能用作数组元素,因为数组成员灵活
本标准禁止在6.7.2.1(3)中:
结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身实例,但可包含指向自身实例的指针),具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型此类结构(以及可能递归地包含此类结构成员的任何并集)不得是结构的成员或数组的元素。
(重点是我的)
gcc和clang允许struct
s具有灵活的数组成员作为struct
s的成员或数组作为扩展。该标准禁止这样做,因此使用这种代码是不可移植的,每个编译器都有权拒绝该代码
链接的问题与此无关,它是关于如果带有灵活数组成员的
结构被实例化为自动,则不会发出警告,这是标准所不允许的(但SDCC和其他人接受作为扩展)。SDCC就在那里,gcc-4.6.2也不会“很好”编译它。好吧,如果你要求它学究式地遵守标准
使用-std=c99-pedantic
(或-std=c1x-pedantic
)编译时,gcc会发出
警告:使用灵活数组成员的结构无效
而clang-3.0的行为也类似,它的警告信息稍微多一些:
警告:“STRLIST_ENTRY”不能用作数组元素,因为数组成员灵活
本标准禁止在6.7.2.1(3)中:
结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身实例,但可包含指向自身实例的指针),具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型此类结构(以及可能递归地包含此类结构成员的任何并集)不得是结构的成员或数组的元素。
(重点是我的)
gcc和clang允许struct
s具有灵活的数组成员作为struct
s的成员或数组作为扩展。该标准禁止这样做,因此使用这种代码是不可移植的,每个编译器都有权拒绝该代码
链接的问题与此无关,它是关于如果带有灵活数组成员的结构被实例化为自动,则不会发出警告,这是标准所不允许的(但SDCC和其他人将其作为扩展接受)。想想这是一个错误的原因
STRLIST_条目的大小未知,因为str[]的长度可变
STRLIST包含STRLIST_条目的可变长度数组
在内存中,数组是一系列紧跟在一起的STRLIST_条目
既然元素的大小未知,那么如何知道索引指向的偏移量呢
char str[]应该指定一个固定的大小,或者将char*设置为数组外部的字符串。想想这是一个错误的原因
STRLIST_条目的大小未知,因为str[]的长度可变
STRLIST包含STRLIST_条目的可变长度数组
在内存中,数组是一系列紧跟在一起的STRLIST_条目
既然元素的大小未知,那么如何知道索引指向的偏移量呢
char str[]应该指定一个固定的大小,或者将char*设置为数组外部的字符串。非常好。SDCC文档充其量也很糟糕,GCC对该声明的接受让我更加困惑。非常感谢你!杰出的SDCC文档充其量也很糟糕,GCC对该声明的接受让我更加困惑。非常感谢你!