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

问题描述 投票:6回答:2

警告here有其合理性,但无法回答全部情况。例如,以下代码触发警告:

(int)round(M_PI);

但是另一方面,以下代码却没有:

double d;
(int)(d = round(M_PI));

都不是:

(int)M_PI;

理由是,您不应仅通过强制转换就可以将其转换为int,而应使用roundfloor或类似函数。但是,使用round仍会触发警告,但如上所述,强制转换常量或分配的变量不会。

因此,如果从double转换为int太糟糕了,那么为什么在写(int)d(int)M_PI时没有触发警告?如果要转换返回值,应该以哪种方式规避警告?是否有警告会以更正确/合理的方式处理这些危险的转换?

c gcc-warning
2个回答
7
投票

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

警告:将函数调用强制转换为不匹配的类型。例如,警告是否将返回整数类型的函数调用转换为指针类型。

顾名思义,-Wbad-function-cast仅在将函数调用转换为不匹配的类型时才发出警告。它不会在所有演员表上发出警告。这解释了为什么您在最后两个示例中没有得到警告:

您是对的,因为可能会丢失信息,所以从M_PI强制转换为#define M_PI 3.14159...可能很不好。您可以通过简单地将函数返回值分配给匹配的类型,然后稍后进行转换来避免发生GCC警告,如您的两个不触发警告的示例中所示。

当然,警告的要点不是强迫您编写额外的代码来执行相同的操作。即使对于“返回整数值”的函数,例如doubleint。您应该做的是检查该值是否可以安全地先投射


0
投票

[如果您总体上喜欢警告,但又对无法编写禁止它的显式强制转换感到恼火,则可以在GCC上执行此操作:

round()

我只会在您不希望引入中间值的情况下(即在宏中)使用此方法。正如其他人指出的那样(在此处the return value may be too big to fit in an int中),免费的lrint()/ lround()可能无法得到优化。并且在宏中插入中间值是不卫生的。

© www.soinside.com 2019 - 2024. All rights reserved.