0

"This line"以下のコードは、柔軟な配列メンバー( s)を使用しているため、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はこれを好みません。クリーンにコンパイルされるコードのメモリ構造を参照できる別の方法は何ですか?

4

2 に答える 2

1

通常の方法は、配列メンバーにサイズを指定することです。

typedef struct {
    int nLen;
    char str[1];
} STRLIST_ENTRY;

それはコンパイラを幸せに保ちます。

編集--std-c99または--std-sdcc99スイッチを使用して、SDCCに元のコードを認識させることができますか?

于 2013-03-18T22:17:28.050 に答える
0
typedef struct {
    int nLen;
    char *str;                    
} STRLIST_ENTRY;

私はそれをこのようにして、使用する準備ができたらアレイをmallocします。構造体名を定義するためにすべて大文字を使用している特別な理由はありますか?通常、これらはほとんどのコーディング標準では小文字です。

于 2013-03-18T23:23:17.523 に答える