することができint (*)[]
、不完全型で?
C 2018 6.2.5 1は言う:
翻訳単位内のさまざまな時点で、オブジェクトタイプは不完全(そのタイプのオブジェクトのサイズを決定するのに十分な情報がない)または完全(十分な情報がある)の場合があります。
したがって、型のサイズがわかっていれば、型は完全であるように見えます。6.2.6.1 28は、特定のタイプのポインターは同じサイズ(ポインターvoid
と文字、互換タイプへのポインター、構造体へのポインター、および共用体へのポインター)でなければならないことを指定していますが、他のタイプへのポインターは異なる場合があります。
すべてのポインター、またはの配列へのすべてのポインターがint
同じサイズであるCの実装では、のサイズint (*)[]
がわかっているため、完全なサイズになります。たとえば、大きな配列に異なるポインタを使用する実装では、サイズがわからないため、不完全です。
以下のようにMMが指摘し、構造これは、ポインタのサイズの実装が受け入れなければならないことを示唆している6.7.2.1 3に制約ごとに、最終的な可撓性のアレイメンバーを除き、不完全な型とメンバーを含んではならないstruct { int (*p)[]; }
異なる有する実装ながらそのような配列のサイズは、制約違反を診断する必要があります。(これは、そのような宣言が厳密に準拠するCの一部ではないことを意味します。)
void *
完全であるという事実は、不完全な型へのポインタが完全である可能性があることを示しています。不完全な型へのポインタが不完全である可能性があるかどうかは示しません。「哺乳動物は象になれるのか」と尋ねられた場合、「ライオンは哺乳動物である」と示しても、哺乳動物が象になることはできません。質問は、不完全な型へのポインターのセットXに不完全な要素が含まれているかどうかを尋ねます。不完全な型へのポインタのセットXに完全な要素が含まれていることを示すことは無関係です。