禁用GCC缩小转换错误

Disable GCC narrowing conversion errors

本文关键字:错误 转换 缩小 GCC 禁用      更新时间:2024-09-26

我在C/C++中有20多年的代码,其中一种用于处理可变数据大小的技术是让自动类型转换来处理它

例如:

#define MY_STATUS_UNDEFINED (-1)

然后,如果将其与int64_t进行比较/使用,则将其自动扩展为-1LLuint64_t0xFFFFFFFFFFFFFFFFuint32_t0xFFFFFFFFint16_t-1uint16_t0xFFFF

然而,现在我在新的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是我最喜欢的编译选项。