繁体   English   中英

声明和定义之间的冲突是否会导致未定义的行为?

[英]Does the confliction between declaration and definition cause undefined behavior?

例如,在一个源文件中:

extern int a[10];
int main()
{
   (void)sizeof(a);
   return 0;
}

在第二个源文件中,我们有:

int a[20];//different with the first source 

上面的代码是否会导致未定义的行为 据我所知,在C中它说:

引用同一对象或函数的所有声明都应具有兼容类型; 否则,行为未定义。

int[10]int[20]兼容(在c的视图中)? 那么C ++标准呢?

此外,如果没有第二个源文件,使用sizeof(a)是否合法( a只有一个声明)?

是的,这是C中未定义的行为,它们不兼容,参见C11 6.7.6.2数组声明符第6段

要使两个数组类型兼容,两者都应具有兼容的元素类型,如果两个大小说明符都存在,并且是整数常量表达式,则两个大小说明符应具有相同的常量值。 如果在要求它们兼容的上下文中使用这两种数组类型,则如果两个大小说明符计算为不相等的值,则它是未定义的行为。

来自[basic.link] p11的 C ++中没有需要诊断的错误

在对类型进行所有调整(其中typedef由其定义替换)之后,引用给定变量或函数的所有声明指定的类型应该是相同的,除了数组对象的声明可以指定由于存在或不同而存在的数组类型没有主要数组绑定([dcl.array])。 违反此规则的类型标识不需要诊断。

一些实现将根据由平台的一组约定定义的规则来处理导入和导出的符号,这些约定通常在文档中描述,在现代的说法中,该文档称为应用程序二进制接口。 如果一个模块(编译单元)导出符号而另一个模块导入它,则每个定义及其交互将按照ABI所描述的方式运行,而不管导入或导出符号的代码语言规则如何。

其他实现,尤其是那些使用整个程序优化的实现,可以处理从一个C编译单元导出的符号,并以不同于ABI建议的方式使用另一个C编译单元,特别是如果这样做会使事情更有效,或者允许构建系统以产生更好的诊断。

由于这两种方法都有很多优点和缺点,因此标准对于实现如何处理不同模块中的函数之间的交互是不可知的。 如果平台ABI恰好定义了行为, 并且 C实现文档表明C模块以ABI定义的方式进行交互,则无论标准是否强加任何要求,都将在该实现上定义行为。 在标准没有要求的其他情况下,任何事情都可能发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM