&引用;警告:控件达到非无效函数的末尾“;在简单for循环(GCC)中

&引用;警告:控件达到非无效函数的末尾“;在简单for循环(GCC)中,c,C,请看下面的代码: intfoo(无效){ 对于(int i=0;i!=1;i=1){ 返回i; } } 带有-Wall-Wextra-pedantic-std=c99的GCC 10.2发出以下警告: warning: control reaches end of non-void function [-Wreturn-type] 如果我没有遗漏什么,foo显然会终止——它将始终返回0 如何修复此警告?我不能使用GCC诊断Pragma,因为上面的for循环实际上是由一个宏生成的,该宏必须是语句

请看下面的代码:

intfoo(无效){
对于(int i=0;i!=1;i=1){
返回i;
}
}
带有
-Wall-Wextra-pedantic-std=c99的GCC 10.2发出以下警告:

warning: control reaches end of non-void function [-Wreturn-type]
如果我没有遗漏什么,
foo
显然会终止——它将始终返回0

如何修复此警告?我不能使用GCC诊断Pragma,因为上面的for循环实际上是由一个宏生成的,该宏必须是语句前缀,所以我不能在用户提供的语句之后(
{return I;}
在上面的示例中)


您的假设是正确的,您所显示的函数中的代码永远无法超出
for
循环,因此,“无效返回”无法执行。但是,许多(大多数)编译器不会接受这一点作为不发出警告的理由。(当您的
if
else-if
块覆盖了所有可能性,但仍然忽略了“终端”
else
块时,可能会出现类似情况

如何修复此警告

只需在函数末尾添加一个
return 42;
语句(整型文字的值可以是您喜欢的任何值)


有趣的是,“clang cl”代码分析工具给出了两个警告:一个警告是
for
循环从未运行过它的第一次迭代,另一个警告是关于到达非空函数末尾的控制(如GCC警告),感谢您提供了详细的答案!您还可以将
\uuUbuiltin\uUnreachable()
结尾,但这是特定于编译器的。@interjay确实-这将使代码更加清晰,但会牺牲更多字符。(但无论如何,我会在
return 42;
语句之后添加注释。)