繁体   English   中英

以下分配仅导致警告。 关于C如何对待类型等价,这说了什么?

[英]The following assignment only causes a warning. What does this say about how C treats type equivalence?

以下分配仅导致警告。 关于C如何对待类型等价,这说了什么?

int *iptr;
float *fptr;
float fval;
fval = 0.0;
fptr = &fval;
iptr = fptr;

特别是,我指的是上面代码片段的最后一行中的赋值; 即,

iptr = fptr;

它更多地说明了你使用的编译器的行为而不是关于C的行为,尽管C标准允许编译器的行为(不幸的是恕我直言)。

int*float*类型是不同的,语言定义它们之间没有隐式转换。

尝试在没有强制转换的情况下将一个分配给另一个(即显式类型转换)是违反约束 ,这意味着需要编译器发出诊断消息。

C标准不要求这种诊断是致命的。 通过发出警告,就C标准而言,编译器已完成其工作。 它可以在相同的有效性下拒绝您的程序(在我看来,这将更加用户友好)。 但这两种行为都是一致的。

您可以以某种方式调用编译器,使其将其视为致命错误。 例如,如果您正在使用gcc -pedantic-errors选项(以及指定要使用哪个版本的C标准的选项)应该可以解决问题。

如果你真的想要执行该任务(包含所有需要的风险),你可以使用强制转换:

iptr = (int*)fptr;

除了(可能)关闭编译器警告,指针应该投作为你正在做的事情非常棘手的提醒,它可能在你的脸上吹,如果你don'w知道你在做什么

暂无
暂无

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

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