为什么符合要求的实现与具有内部链接的不完整数组类型的行为不同?
示例代码(t0.c):
static int arr[ ];
int main( void )
{
return arr[ 0 ];
}
static int arr[ ] = { 0 };
调用:
$ gcc t0.c -std=c11 -Wall -Wextra
<nothing>
$ clang t0.c -std=c11 -Wall -Wextra
<nothing>
$ cl t0.c /std:c11 /Za
t0.c(1): error C2133: 'arr': unknown size
$ gcc t0.c -std=c11 -Wall -Wextra -pedantic
t0.c:1:12: error: array size missing in ‘arr’
$ clang t0.c -std=c11 -Wall -Wextra -pedantic
<nothing>
C11,6.2.5 类型,22:
未知大小的数组类型是不完整的类型。对于那种类型的标识符,通过在后面的声明中指定大小(具有内部或外部链接)来完成。
C11,6.9.2 外部对象定义,3:
如果对象的标识符声明是临时定义并具有内部链接,则声明的类型不应是不完整的类型。
C11,J.2 未定义行为,1:
具有内部链接和不完整类型的对象的标识符用暂定定义 (6.9.2) 声明。
问题:为什么一致的实现表现出不同的行为?哪一个行为正确?