>OS : Windows10 Enterprise (ver 22H2)
>コンパイラ: gcc 6.3.0
ちょっと調べてMinGWはgcc 6.3.0って古すぎないかという記事を見かけたので、
https://stackoverflow.com/questions/68360901/why-is-the-latest-mingw-gcc-version-6-3-0
MinGWなら6.3.0があるのかな、とosdn.netからmingw-get.exeとやらを入手して
6.3.0をインストールしようとしたのですがないと言われて
7.3.0-1を(むりやり)動かしたら再現しました。正直驚きました。
>#include <stdio.h>
>
>static int a[];
>
>int main()
>{
>
> return 0;
>}
これだと配列aのサイズが決まっていないわけで、ではコンパイラはaのサイズを
いくつだと思っているのか確認しようと
printf("sizeof a..%d\n", sizeof(a));
とやってみると、
invalid application of 'sizeof' to incomplete type 'int[]'
と言われます。aがincomplete type(不完全型)だと言っています。
これについては規格でも「6.2.5 型」のところで
| 大きさの分からない配列型は,不完全型とする。その型は,それ以降のその型の
| 識別子の宣言(内部結合又は外部結合をもつ)で大きさを指定することによって,
| 完全となる。
という記載があるので、以下のようにint a[10];を追加したら、
gccの9.4.0でもコンパイルが通って、「sizeof a..40」と表示されました。
#include <stdio.h>
static int a[];
static int a[10];
int main()
{
printf("sizeof a..%d\n", sizeof(a));
return 0;
}
それにしても、staticなのにこの.c内でサイズ指定して完全型にならないのなら、
やっぱりコンパイルを通してはダメだと思うのですが……
なので最近のgccではエラーにしているのだと思います。
私も勉強になりました。ありがとうございました。