在switch语句中使用unsigned long的lint警告

时间:2016-08-09 20:40:48

标签: c switch-statement long-integer lint

我有以下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正在给我一个警告说 &#34;警告:44非法转换:大小超过UB4&#34;

unsigned long上使用开关是否有效?

我没有收到任何编译错误,但希望确保我的代码正常运行,并且没有任何有趣的翻转类型的内容。

交换机中没有太多的案例标签。

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

在Java的情况下,看起来switch语句类型不应该很长。 C也是如此吗?

如果需要: 1.我正在使用linux lint 2. gcc for compiler 3.平台是linux 64位

1 个答案:

答案 0 :(得分:0)

不,与Java不同,C允许switch语句的控制语句为任何整数类型。这包括intlongunsigned longuint32_t以及标准中定义的任何其他整数类型。

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

但是我怀疑最可能的问题是大多数案例标签超过了控制语句类型的最大值。例如,如果系统上的unsigned long为32位,则程序的案例标签可能大于该标签,因此如果不能发生此标签,则警告将是适当的。

另一种可能性是,您的交换机的标签数量多于系统上单个交换机中的情况的实施限制。允许实现设置此限制。

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

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