【问题标题】:C — warning: control reaches end of non-void function [-Wreturn-type]C — 警告:控制到达非空函数的结尾 [-Wreturn-type]
【发布时间】:2015-03-26 06:01:10
【问题描述】:

我是 C 编程的新手。 谁能帮我解释一下我遇到的错误。 我不明白为什么会出现此错误。

test4.c: In function 'main':
test4.c:65:3: warning: control reaches end of non-void function [-Wreturn-type]

下面是我的代码:

#include <webots/robot.h>
#include <webots/distance_sensor.h>
#include <webots/differential_wheels.h>

#define TIME_STEP 64

int main()
{
   wb_robot_init();
   int i;
   WbDeviceTag ps[8];
   char ps_names[8][4] = {"ps0","ps1","ps2","ps3",
      "ps4","ps5","ps6","ps7"};

   for(i=0;i<8;i++)
   {
      ps[i]=wb_robot_get_device(ps_names[i]);
      wb_distance_sensor_enable(ps[i], TIME_STEP);
   }

   while(1)
   {
      int delay=wb_robot_step(TIME_STEP);
      if(delay==-1)
         break;

      double ps_values[8];
      for(i=0;i<8;i++)
         ps_values[i]=wb_distance_sensor_get_value(ps[i]);
      //printf("ps0=%d\t", ps_values[0]); 

      double left_speed=500;
      double right_speed=500;

      for(;;)
      {

         if(ps_values[0]>80 || ps_values[1]>80 || ps_values[2]>80)
         {
            left_speed =-500;
            right_speed =500;
         }
         else if(ps_values[5]>80 || ps_values[7]>80 || ps_values[2]>80)
         {
            left_speed =500;
            right_speed =-500;
         }
         else
         {
            left_speed =500;
            right_speed =500;
         }

      }
      wb_differential_wheels_set_speed(left_speed, right_speed);
      wb_robot_cleanup();
      return 0;
   }
}

【问题讨论】:

  • return 0; 应该不在while (1) {...} 范围内。
  • 一个空格缩进是相当小的。我推荐 4 个空格作为一个很好的缩进。

标签: c


【解决方案1】:

您有一个不返回值的非 void 函数。你的编译器已经分析出可以到达函数的末尾。

if(delay==-1)
    break;

因此,您遗漏了退货声明是可疑的或错误的。

在函数末尾添加return 0; 或任何合理的值。

ma​​in 功能很特别。不返回值是有效的C。但即使跳过返回是合法的,编译器可以给你一个诊断信息(也就是警告)。

您可以尝试使用某种编译指示或命令行参数来说服您的编译器。或者你放弃并返回一个值,即使你认为没有必要。这将抑制此警告。 (一种说法并不昂贵。)

【讨论】:

  • main(); 0 是合理的“成功”状态。它也可以拼写为 EXIT_SUCCESS(在&lt;stdlib.h&gt; 中定义。EXIT_FAILURE 是一个替代的标准化值。
【解决方案2】:

在我看来,您在while 循环末尾的return 语句被错误地放置在那里。否则,函数将在循环内的代码执行一轮后返回。那么循环的意义何在?

而不是

   while(1)
   {
      int delay=wb_robot_step(TIME_STEP);
      if(delay==-1)
         break;

      ....
      ....

      wb_differential_wheels_set_speed(left_speed, right_speed);
      wb_robot_cleanup();
      return 0;
   }

也许你打算使用:

   while(1)
   {
      int delay=wb_robot_step(TIME_STEP);
      if(delay==-1)
         break;

      ....
      ....

      wb_differential_wheels_set_speed(left_speed, right_speed);
      wb_robot_cleanup();
   }

   // The return statement outside the while loop.
   return 0;

这也将修复编译器警告。

【讨论】:

  • 我已经尝试按照您的建议进行操作,它有效!非常感谢你! ^.^
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多