質問
:CでCの構文は、後方参照と前方参照(ポインタ)を持つ自己完結型の静的に割り当てられた完全constデータ構造を定義できますか?私はこれらの制約を有するデータ構造を定義する必要が
- (大丈夫C99)構造(構造体)インスタンスを含む構造のインスタンスの数を含みます他のポインタへのポインタ構造体のインスタンス(グラフ構造ですが、概念的にはの二重リンクリストで十分です) 全体の構造は静的にコンパイル時に割り当て をしなければならない
- (リンクされることを、メモリ内のアドレスではなく、完全なポインタを含む全体構造のメモリレイアウト)すべてのフィールドが定数を宣言されている
- (ポインタ)前方ある
- 一部参照、後方一部含みます。 IOWは、宣言を解析するときに、まだ解析されていないフィールドを参照するポインタもあります(しかし、構造体はコンパイラによって認識されているため、メモリ内のレイアウトはすでにわかっています)。
- 移植性、標準準拠、大きなプラス。
あなたは、私はそれをやったが、私は躊躇して簡単なリファレンスを見つけないので、この質問は私の将来の自己と同じことを必要とするすべての人を助けるのに役立つ
を投稿する前に検索します。
メタファー
楽しい事実:すべてのこれらの制約に従うためには、段ボール箱の上部を折るように感じている:それは完了だ後、それはしっかりとフィットしますが、それはすべての部品を合わせて持っているか、それは動作しません。
(画像はhttps://www.youtube.com/watch?v=H5oOBLSJzGMクレジット)
'ので' const'、あなたがnode1'、 'node2'、'ノード3 'から' const'修飾子を削除することができます'と'フィールド '。 'const struct node_t *'のような最初の 'const'修飾子を使わずに' previous'と 'next'を宣言することもできます。 – user694733
@ user694733最初の部分(フィールド宣言から 'const'を削除する)が真になります。メリットは、一般的に書くことができるstructを定義することですが、特定の 'graph'インスタンスを書くことはできません。最後の部分は違うようです。 –
あなたが書いたように正確に行うとき( '*'と 'previous'の間に' const'を削除する)、2番目の部分についても真です。他の 'const'を削除すると正当な警告が出ます。なぜなら' node_t'は 'const graph_t graph 'の一部である* const *であるstructを変更しないことを約束しないからです。微妙だが一貫性がある。ありがとう@ user694733。 –