加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我可以依靠我的编译器来诊断TU中的类型不匹配吗?

发布时间:2020-12-16 06:56:26 所属栏目:百科 来源:网络整理
导读:在搜索规范时,似乎我的编译器不需要诊断这样的错误 extern int a;extern float a; 我以前认为我的编译器需要诊断它,但规范说(我强调添加) After all adjustments of types (during which typedefs (7.1.3) are replaced by their definitions),the types spe
在搜索规范时,似乎我的编译器不需要诊断这样的错误

extern int a;
extern float a;

我以前认为我的编译器需要诊断它,但规范说(我强调添加)

After all adjustments of types (during which typedefs (7.1.3) are replaced by their definitions),the types speci?ed by all declarations referring to a given variable or function shall be identical,except that declarations for an array object can specify array types that differ by the presence or absence of a major array bound (8.3.4). A violation of this rule on type identity does not require a diagnostic.

事实上,我发现编译器不关心的情况.例如,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? (粗略地)要求一个范围内的名称的所有声明都指向同一个实体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读