【发布时间】:2019-12-08 00:21:10
【问题描述】:
我花了很多时间试图找出它无法正常工作的原因,但我觉得我已经涵盖了我需要的每一个案例。我似乎找不到 “控件到达非无效函数的结尾” 错误。这是我的 switch 语句:
static unsigned int sizeIndex(size_t size) {
int determine_size = 0;
switch(determine_size) {
case 0:
if (size < 16) {
return 0;
}
case 1:
if ((size >= 16) && (size < 32)) {
return 1;
}
case 2:
if ((size >= 32) && (size < 64)) {
return 2;
}
case 3:
if ((size >= 64) && (size < 128) ) {
return 3;
}
case 4:
if ((size >= 128) && (size < 256)) {
return 4;
}
case 5:
if ((size >= 256) && (size < 512)) {
return 5;
}
case 6:
if ((size >= 512) && (size < 1024)) {
return 6;
}
case 7:
if ((size >= 1024) && (size < 2048)) {
return 7;
}
case 8:
if ((size >= 2048) && (size < 4096)) {
return 8;
}
case 9:
if ((size >= 4096) && (size < 8192)) {
return 9;
}
case 10:
if ((size >= 8192) && (size < 16384)) {
return 10;
}
case 11:
if ((size >= 16384) && (size < 32768)) {
return 11;
}
case 12:
if (size >= 32768) {
return 12;
}
}
}
任何人都可以看到为什么这会引发“控制到达非空函数 [-Werror=return-type]”错误的原因吗?
谢谢!
【问题讨论】:
-
这是编译器的一个缺点。无法推断必须执行
return语句之一,即使必须执行。就目前的代码而言,您可以将最后一种情况更改为return 12;,并且行为将是相同的并且编译器会被满足。但是,如果更改开头的int determine_size = 0;,则最终情况的这种更改和不更改的行为将不一样——执行确实可能会通过switch到函数的末尾…… -
因为你在函数末尾没有返回语句,以防上面的返回都不匹配。
-
... 你有计划让这个函数使用不同的
determine_size值吗?如果是这样,当没有执行的测试评估为真时,您希望它返回什么?因为,如果determine_size大于 0,对于size的值小于第一次测试的阈值,执行将通过switch,所以你应该有一个return语句来覆盖它。
标签: c gcc switch-statement