C 警告:控件可能到达非无效功能的末尾[-Wreturn类型]
我在编译这个波兰命令行计算器时遇到了这个错误 警告:控件可能到达非无效功能的末尾 [-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 >
#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我不完全理解你,你是说你的程序不工作还是我发布的代码?你刚才问为什么你会得到警告,这是一个答案。通常,堆栈溢出不适用于“这是我的代码,为什么它不工作”之类的问题,请参阅