C++ 使用 typedef 避免类型转换警告
C++ avoid type conversion warning with typedef
我正在使用 typedef float engtype
和 typedef double engtype
在 float
和 double
之间快速切换以进行一些测试。例如,当我这样做时
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
的这种用法不正确吗?我应该如何处理这些警告?我知道我可以忽略它们,但应该有一种 "correct" 方法来清除它们。
您对 typedef 的使用是正确的。要处理警告,您必须使用 static_cast(NUMBER).
你的常量是双精度的,这就是为什么它在转换为浮点数时会报错。如果你让它们漂浮:
engtype rmwt = 20.75F;
然后它将 float 转换为 double,或将 float 转换为 float,编译器不会报错。
要初始化浮点值,您必须使用 "f" 后缀
例如
auto pi = 3.14 ; // pi type is double in this case
要分配浮点值,您应该使用 f 后缀
auto pi = 3.14f; // pi type is deduced to float
因此,当您更改 typdef 时,您是在将双精度值分配给浮点类型。
您无法更改 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;
我正在使用 typedef float engtype
和 typedef double engtype
在 float
和 double
之间快速切换以进行一些测试。例如,当我这样做时
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
的这种用法不正确吗?我应该如何处理这些警告?我知道我可以忽略它们,但应该有一种 "correct" 方法来清除它们。
您对 typedef 的使用是正确的。要处理警告,您必须使用 static_cast(NUMBER).
你的常量是双精度的,这就是为什么它在转换为浮点数时会报错。如果你让它们漂浮:
engtype rmwt = 20.75F;
然后它将 float 转换为 double,或将 float 转换为 float,编译器不会报错。
要初始化浮点值,您必须使用 "f" 后缀 例如
auto pi = 3.14 ; // pi type is double in this case
要分配浮点值,您应该使用 f 后缀
auto pi = 3.14f; // pi type is deduced to float
因此,当您更改 typdef 时,您是在将双精度值分配给浮点类型。
您无法更改 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;