【发布时间】:2013-03-18 22:15:22
【问题描述】:
以下代码拒绝在 SDCC 中编译,因为我使用了灵活的数组成员("This line"s)。
/** 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[]; // This line
} STRLIST_ENTRY;
/** string list data type */
typedef struct {
STRLIST_HEADER header;
STRLIST_ENTRY entry[]; // This line
} STRLIST;
int main()
{
return 0;
}
但是,我必须访问的数据已经以这种方式设置(我通过指针访问现有内存,而不是破坏堆栈),并且使用结构指针可以生成非常干净的代码。不幸的是,SDCC 不喜欢这样。有什么替代方法可以在我的代码中引用可以干净编译的内存结构?
【问题讨论】:
-
根据标准,具有灵活数组成员的结构不能是结构的成员或数组的元素。所以
STRLIST无效。 -
@DanielFischer 我知道。重写此代码以使其符合标准的最佳方法是什么?
-
好问题。您标记
char str[];行让我怀疑SDCC 根本不喜欢灵活的数组成员?在这种情况下,我看到的唯一选择是为数组设置固定大小,或使用指针(并放弃局部性)。如果它接受灵活的数组成员,但不是递归的,你可以作弊并在STRLIST中使用unsigned entry[];。不过,也不完全令人满意。