big*_*iao 12 c c++ undefined-behavior language-lawyer
例如,在一个源文件中:
extern int a[10];
int main()
{
(void)sizeof(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在第二个源文件中,我们有:
int a[20];//different with the first source
Run Code Online (Sandbox Code Playgroud)
上面的代码是否会导致未定义的行为?据我所知,在C中它说:
引用同一对象或函数的所有声明都应具有兼容类型; 否则,行为未定义.
是int[10]
和int[20]
兼容(在c
视图中)?那么C++标准呢?
此外,如果没有第二个源文件,使用是否合法sizeof(a)
(a
只有声明)?
Sha*_*our 10
是的,这是C中未定义的行为,它们不兼容,参见C11 6.7.6.2数组声明符第6段
要使两个数组类型兼容,两者都应具有兼容的元素类型,如果两个大小说明符都存在,并且是整数常量表达式,则两个大小说明符应具有相同的常量值.如果在要求它们兼容的上下文中使用这两种数组类型,则如果两个大小说明符计算为不相等的值,则它是未定义的行为.
来自[basic.link] p11的 C++中没有需要诊断的错误:
在对类型进行所有调整(其中typedef由其定义替换)之后,引用给定变量或函数的所有声明指定的类型应该是相同的,除了数组对象的声明可以指定由于存在或不同而存在的数组类型没有主要数组绑定([dcl.array]).违反此规则的类型标识不需要诊断.