c++使用typedef避免类型转换警告

C++ avoid type conversion warning with typedef

本文关键字:类型转换 警告 使用 typedef c++      更新时间:2023-10-16

我使用typedef float engtypetypedef double engtypefloatdouble之间快速切换进行一些测试。例如,当我这样做

engtype rmwt = 20.75;
engtype Rgas = 8314.28 / rmwt;

编译器抱怨从double转换为engtype时可能会丢失或截断数据。为了让这个警告消失,我写了

engtype rmwt = 20.75;
engtype Rgas = static_cast<engtype>(8314.28) / rmwt;

这似乎有点可笑。我搜索了一种方法,使其默认为engtype,但没有找到任何东西。typedef的这种用法不正确吗?我应该如何处理这些警告?我知道我可以忽略它们,但是应该有一个"正确"的方法来清除它们。

你不能改变8314.28的意思:它是double,句号。

可以做的是用一个关联的用户定义文字来完成你的typedef:

engtype operator ""_eng (long double d) {
    // Add a cast here if the compiler still complains
    return d;
}
获得:

auto rmwt = 20.75_eng;
auto Rgas = 8314.28_eng / rmwt;

你的常量是双精度,这就是为什么它在转换为浮点数时抱怨。如果你让它们成为浮动:

engtype rmwt = 20.75F;

然后将float类型转换为double类型,或者将float类型转换为float类型,编译器不会报错。

您对typedef的使用是正确的。要处理警告,必须使用static_cast(NUMBER)。

初始化float值必须使用"f"后缀例如

auto pi = 3.14 ;      // pi type is double in this case

要分配浮点值u应该使用f后缀

auto pi = 3.14f;         // pi type is deduced to float

所以当你改变typdef时,你是在给float类型赋双精度值