gcc 4.3 で奇妙な問題が発生しました。それがコンパイラ固有の問題なのか、それとも一般的な C の問題なのかを知りたいと思っていました。確かに、私は非常に奇妙な構造を使用していますが、そうでなければ不可能なルールを適用できるので、気に入っています。プロジェクトはいくつかのモジュールに分割され、各モジュールには不透明な構造があります。ヘッダーに宣言がありtypedef struct <tag> <type>
、1 つの c ファイルに a がありstruct tag { ... };
、すべての関数が a を介して要素を参照し<type> *
ます。
各モジュールは独自の構造を認識しており、他のモジュールの構造は表示されません。1 つのモジュールでは、1 つの要素ではなく、要素の固定配列で作業します。これは、そのモジュールの一部の関数が配列へのポインターで動作することを意味します。そのモジュールを と呼びましょうwdi
。だから私は例えば
void write_all(wdi_type (*wdis)[MAX_WDI]);
そして割り当てのために(私は非常に珍しい構文を知っています)、配列への正しいポインタを直接返します。
wdi_type (*wdi_alloc(void))[MAX_WDI];
これは、GNU-C 3.4.6 (Solaris SPARC)、cc の下で、それがコンパイルする sun コンパイラ v12 でもうまく機能します (ただし、アプリの別の部分が壊れているため、テストできませんでした)。ただし、gcc 4.3.3 (4.4.6 x86-64 および 4.6.2 ARM でもテスト済み) では、そうではありません。コンパイル エラーが発生しますarray type has incomplete element type
。その段階でコンパイラがその情報を必要とする理由がわかりません。他の不透明な構造のサイズも必要ありません。
gccのバグですか?
基準は何と言っていますか?
私はそれについて何かを見つけることができませんでした。GNU にバグレポートを提出する必要がありますか?