c – 我可以依靠我的编译器来诊断TU中的类型不匹配吗?
在搜索规范时,似乎我的编译器不需要诊断这样的错误
extern int a; extern float a; 我以前认为我的编译器需要诊断它,但规范说(我强调添加)
事实上,我发现编译器不关心的情况.例如,GCC和clang接受以下内容 void g() { int f(); } void h() { float f(); } 由于违反了不需要诊断的规则意味着整个程序不再需要诊断,这意味着以下不正确的程序也不需要诊断(见1.4p2).幸运的是,GCC和Clang都诊断出它们. int f(); float f(); 此代码在转换时的行为实际上是未定义的.这是什么原因?为什么规范不要求拒绝此类案例并要求对其进行诊断? 解决方法
我认为你引用的规则是谈论整个计划.如果一个TU具有extern int a,则不需要诊断;另一个有外部浮动a;因为单独的翻译使其变得不可能 – 问题只能在链接时检测到.
但如果两个声明都发生在一个TU内,我确定需要进行诊断.也许是3.3 / 4? (粗略地)要求一个范围内的名称的所有声明都指向同一个实体. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |