-Wbad-function-cast的目的是什么,为什么它只适用于直接返回值?

sky*_*ing 6 c gcc-warning

还有的警告的理由在这里,但没有回答的全貌.例如,以下代码触发警告:

(int)round(M_PI);
Run Code Online (Sandbox Code Playgroud)

但另一方面,以下代码不会:

double d;
(int)(d = round(M_PI));
Run Code Online (Sandbox Code Playgroud)

这不是:

(int)M_PI;
Run Code Online (Sandbox Code Playgroud)

的理由是,你不应该转换简单地铸造为int,但你应该使用round,floor或类似的功能.但是,使用round仍然会触发警告,但如上所示,类型化常量或指定的变量则不会.

所以,如果它是坏的,从投doubleint,那么当你写为什么不报警触发(int)d(int)M_PI?如果你想转换返回值,应该以什么方式规避警告?是否有警告可以更正确/合理的方式处理这些危险的转换?

con*_*gus 6

-Wbad-function-cast (仅限C和Objective-C)

将函数调用强制转换为非匹配类型时发出警告.例如,警告是否将对返回整数类型的函数的调用强制转换为指针类型.

顾名思义,-Wbad-function-cast只有在将函数调用转换为非匹配类型时才会发出警告.它没有警告所有演员阵容.这就解释了为什么你没有得到前两个例子的警告:

你是正确的,它可能是坏的,从投doubleint作为你可能会丢失信息.您可以通过简单地将函数返回值分配给匹配类型然后再转换来避免GCC警告,就像在两个不触发警告的示例中一样.

当然,警告的重点不是强迫你编写额外的代码来做同样的事情.即使对于函数"返回的累计值"之类round(),则返回值可能太大而不适合用int.您应该做的是检查该值是否安全.