C 警告:控件可能到达非无效功能的末尾[-Wreturn类型]

C 警告:控件可能到达非无效功能的末尾[-Wreturn类型],c,controls,C,Controls,我在编译这个波兰命令行计算器时遇到了这个错误 警告:控件可能到达非无效功能的末尾 [-Wreturn类型] } 我理解错误消息意味着我可能没有从函数返回任何内容,但这是在哪里发生的 #include <stdio.h> #include <stdlib.h> void push(int element); int pop(); int main(int argc, char **argv) { int op2; while (argc >

我在编译这个波兰命令行计算器时遇到了这个错误

警告:控件可能到达非无效功能的末尾 [-Wreturn类型] }

我理解错误消息意味着我可能没有从函数返回任何内容,但这是在哪里发生的

#include <stdio.h>
#include <stdlib.h>


void push(int element);
int pop();


int main(int argc, char **argv)
{

    int op2;


    while (argc > 1)            
      {


        switch(argv[1][0])  {

          case '1':
          case '2':
          case '3':
          case '4':
          case '5':
          case '6':
          case '7':
          case '8':
          case '9':
          push(atoi(*argv));
          argv++;
          break;

          case '+':
          push(pop() + pop());
          argv++;
          break;

          case '*':
          push(pop() * pop());
          argv++;
          break;

          case '-':
          op2 = pop();
          push(pop() - op2);
          argv++;
          break;

          case '/':
          op2 = pop();
          if (op2 != 0) {
              push(pop() / op2);
              argv++;
          }

          else
              printf("error: zero divisor\n");
          break;

          default:
          printf("error: unknown operand %s\n", *argv);
          break;

          }

     }

     printf ("%d\n", pop());
     return 0;

 }        




#define STACKSIZE 1000

int next = 0;             /* next free stack position */
int stack[STACKSIZE];

void push(int element)  {

    if (next > STACKSIZE)  printf("error: stack full, can't push %d\n", element); 
    else stack[next++] = element; 

}


int pop()   {

    if (next == 0)  printf("stack empty\n"); 

    else return stack[--next]; 
}
#包括
#包括
虚推(int元素);
int-pop();
int main(int argc,字符**argv)
{
int op2;
而(argc>1)
{
开关(argv[1][0]){
案例“1”:
案例“2”:
案例“3”:
案例“4”:
案例“5”:
案例“6”:
案例“7”:
案例“8”:
案例“9”:
推送(atoi(*argv));
argv++;
打破
格“+”:
推(pop()+pop());
argv++;
打破
案例“*”:
推(pop()*pop());
argv++;
打破
案例'-':
op2=pop();
推送(pop()-op2);
argv++;
打破
案例“/”:
op2=pop();
如果(op2!=0){
推(pop()/op2);
argv++;
}
其他的
printf(“错误:零除数\n”);
打破
违约:
printf(“错误:未知操作数%s\n”,*argv);
打破
}
}
printf(“%d\n”,pop());
返回0;
}        
#定义堆栈大小1000
int next=0;/*下一个自由堆栈位置*/
int stack[STACKSIZE];
无效推送(int元素){
if(next>STACKSIZE)printf(“错误:堆栈已满,无法推送%d\n”,元素);
else堆栈[next++]=元素;
}
int-pop(){
如果(next==0)printf(“堆栈为空\n”);
else返回堆栈[--next];
}

当pop方法中的堆栈为空时,不会返回值

int pop()
{
    if (next == 0)
    {
        printf("stack empty\n"); 
        // return statement missing   
    }
    else
        return stack[--next]; 
}

您可以在此处返回0(或指示堆栈为空的值),但最好在弹出某些内容之前检查堆栈是否为空。例如,您可以添加一个
hasNext
isEmpty
方法,或者在调用pop之前检查大小。

如果
pop
中的
next==0
,则它没有
返回值,而函数返回类型为
int
,这会给您一个警告,在非
void
的函数中,应确保每个控件路径都具有有效的返回类型,例如:

int pop()   {

if (next == 0) { printf("stack empty\n"); return 0; }

else return stack[--next]; 
}

如果您花时间编写MCVE,您会立即看到它。如果执行
块,则您的函数
pop
不会返回任何内容。这可能会导致UB。可能是UB提供的返回0?@user004325我不完全理解你,你是说你的程序不工作还是我发布的代码?你刚才问为什么你会得到警告,这是一个答案。通常,堆栈溢出不适用于“这是我的代码,为什么它不工作”之类的问题,请参阅