C 標準には次のように記載されています。
オブジェクトの識別子の宣言が暫定的な定義であり、内部リンケージがある場合、宣言された型は不完全な型であってはなりません
「宣言された型は不完全な型であってはならない」とはどういう意味ですか?
C 標準には次のように記載されています。
オブジェクトの識別子の宣言が暫定的な定義であり、内部リンケージがある場合、宣言された型は不完全な型であってはなりません
「宣言された型は不完全な型であってはならない」とはどういう意味ですか?
つまり、次のものを持つことは許可されていません。
static int arr[]; // This is illegal as per the quoted standard.
int main(void) {}
配列arr
は暫定的に定義されており、不完全な型 (オブジェクトのサイズに関する情報がない) を持ち、内部リンケージも持っています (内部リンケージがあるstatic
と言いarr
ます)。
以下は(ファイルスコープで)、
int i; // i is tentatively defined. Valid.
int arr[]; // tentative definition & incomplete type. A further definition
// of arr can appear elsewhere. If not, it's treated like
// int arr[] = {0}; i.e. an array with 1 element.
// Valid.
有効です。