gpt4 book ai didi

c - switch 语句中带有 unsigned long 的 lint 警告

转载 作者:行者123 更新时间:2023-11-30 16:58:25 25 4
gpt4 key购买 nike

我有以下 C 代码:

unsigned long val = <my_size>;

switch(val)
{
case (1L<<10): // 1KB
// Do something
break;
case 1L<<20: // 1MB
// Do somnething
break;
case (1L<<30): // 1GB
// Do something
break;
case (1L<<40): // 1TB
// Do something
break;
// Other cases
default:
// Do something
break;
}

现在 lint 给了我一个警告
“警告:44 非法参数切换:大小超过 UB4”

那么在 unsigned long 上使用 switch 是否有效?

我没有收到任何编译错误,但想确保我的代码正常工作,并且没有发生有趣的翻转类型的事情。

开关中不会有太多的 case 标签。

我正在读这篇文章并发现 - Why can't your switch statement data type be long, Java?

看起来 switch 语句类型在 Java 中不应该太长。对于 C 来说也是这样吗?

如果需要:1.我使用的是linux lint2. gcc编译器3.平台为linux 64位

最佳答案

不,与 Java 不同,C 允许 switch 语句的控制语句是任何整数类型。这包括 int、long、unsigned long、uint32_t 以及标准中定义的几乎任何其他整数类型。

不幸的是,您的代码似乎不是真正的工作代码,并且肯定不是 MCVE,因此我只能推测当前的实际问题。另外我不知道您使用的是哪种 linting 软件或编译器,因此无法轻松查找错误消息。

但是我怀疑最可能的问题是最大的 case 标签超过了控制语句类型的最大值。例如,如果您的系统上的 unsigned long 为 32 位,则您的程序可能有一个大于该值的 case 标签,因此如果该标签无法出现,则会出现适当的警告。

另一种可能性是,您的交换机具有的标签数量超过了系统上单个交换机中案例的实现限制。允许实现设置此限制。

如果给出了实际的 MCVE,我可能能够提供更多有用的信息,但因为它是我的答案。

TLDR:是的,开关可以使用unsigned long或任何其他整数类型

关于c - switch 语句中带有 unsigned long 的 lint 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com