禁用GCC缩小转换错误
Disable GCC narrowing conversion errors
我在C/C++中有20多年的代码,其中一种用于处理可变数据大小的技术是让自动类型转换来处理它
例如:
#define MY_STATUS_UNDEFINED (-1)
然后,如果将其与int64_t
进行比较/使用,则将其自动扩展为-1LL
、uint64_t
到0xFFFFFFFFFFFFFFFF
、uint32_t
到0xFFFFFFFF
、int16_t
到-1
、uint16_t
到0xFFFF
等
然而,现在我在新的gcc版本中遇到了一些错误,抱怨转换范围缩小。在这种情况下,它是一个带有UINT
变量的switch
语句。
switch (myuint) {
case MY_STATUS_UNDEFINED:
break;
}
建议使用什么方法使其不会出错?
让它不出错的最简单方法是什么?
什么是最干净的方法,这样它就不会出错,也不会发出任何警告信息?
本质上,我希望它正确地进行自动类型转换,但没有警告或错误。
使用以下简短示例:
#include <cstdint>
#include <iostream>
#define MY_STATUS_UNDEFINED (-1)
void bar()
{
std::cout << "It worksn";
}
void foo(uint32_t n)
{
switch (n) {
case MY_STATUS_UNDEFINED:
bar();
break;
}
}
int main()
{
foo(0xFFFFFFFF);
return 0;
}
您看到以下来自gcc的错误:
error: narrowing conversion of ‘-1’ from ‘int’ to ‘unsigned int’ [-Wnarrowing]
现在,请仔细注意错误消息。gcc正在告诉关闭它的确切选项。看到[-Wnarrowing]
注释了吗?这是编译标志,它负责生成此错误消息。
要关闭它;否-";在它前面:
-Wno-narrowing
所有gcc诊断都使用此约定。现在,显示的代码将编译、运行并产生预期的结果:
It works!
将-Wno-narrowing
添加到全局编译选项中。
你真的应该认为这只是一个临时的创可贴解决方案。这些编译错误正是您想要的。他们在告诉你真实的或潜在的问题。-Wall -Werror -Wsuggest-override -Wreturn-type
是我最喜欢的编译选项。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- C++使用params创建线程函数会导致转换错误
- 在混合代码库中将C转换为C++时出现许多包含错误
- 为什么g++在未执行的代码处标记强制转换错误
- 错误:从"int"到枚举c++的转换无效
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 从标准::未来<void>到非标量标准::未来<bool>引发的错误转换
- 使用宏的错误转换
- 在 opencv 中使用 Color_YUV2BGR 从 YUV 到 BGR 的错误转换
- 无法通过此操作,因为类型的错误转换
- PyQt5:使用自定义信号时 int 对象的错误转换
- 从长途错误转换
- C 错误:转换为非量表类型
- C 错误:转换为执行字符集
- 使用SOCI从PostgreSQL数据库获取数据时发生错误转换
- 分段错误C++转换问题
- 在ARM上的Qt中从双精度到QString的错误转换
- C++浮点转换为Python浮点错误转换
- 错误:转换为非标量类型