아래 코드는 유연한 배열 구성원 ("This line"
)을 사용하기 때문에 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[]; // This line
} STRLIST_ENTRY;
/** string list data type */
typedef struct {
STRLIST_HEADER header;
STRLIST_ENTRY entry[]; // This line
} STRLIST;
int main()
{
return 0;
}
그러나, 액세스 내가 가지고있는 데이터는 이미이 방법을 (내가 스택 스매싱하지 포인터를 통해 기존의 메모리를 액세스하고 있습니다)을 설정하고, 구조체 포인터를 사용하는 것은 매우 깨끗한 코드를하게된다. 불행히도 SDCC는 이것을 좋아하지 않습니다. 코드에서 깔끔하게 컴파일 될 메모리 구조를 참조 할 수있는 또 다른 방법은 무엇입니까? 행복 컴파일러를 유지
typedef struct {
int nLen;
char str[1];
} STRLIST_ENTRY;
:
표준에 따라 유연한 배열 구성원이있는 구조는 배열의 구조 또는 요소의 멤버가 아니어야합니다. 따라서 'STRLIST'는 유효하지 않습니다. –
@ 대니얼 피셔 알아. 표준에 따라이 코드를 다시 작성하는 가장 좋은 방법은 무엇입니까? – thirtythreeforty
좋은 질문입니다. 'char str []; 행을 표시했다는 것은 SDCC가 유연한 배열 멤버를 전혀 좋아하지 않는다고 의심하게 만듭니다. 이 경우 내가 볼 수있는 유일한 옵션은 배열의 고정 크기를 설정하거나 포인터를 사용하여 지역을 포기하는 것입니다. 유연한 배열 멤버를 받아들이지 만 재귀 적으로는 받아 들일 수 없다면'STRLIST'에서'unsigned entry [];를 속여서 사용할 수 있습니다. 또한 완전히 만족스럽지 않습니다. –