hanghanga 发表于 2023-12-28 22:16:12

关于函数返回值警告的问题,怎样消除这个警告?

下面的select函数的第34行会有警告:control reaches end of non-void function [-Wreturn-type]。怎样可以避免这个警告呢?
#include <stdio.h>

typedef int (*PTR_TO_FUN)(int, int);

int add(int, int);
int sub(int, int);
int calculate(PTR_TO_FUN, int, int);
PTR_TO_FUN select(char);

int add(int x, int y)
{
    return x + y;
}

int sub(int x, int y)
{
    return x - y;
}

int calculate(PTR_TO_FUN fun, int x, int y)
{
    return fun(x, y);
}

int (*select(char ch))(int, int)
{
    switch (ch)
    {
    case '+':
      return add;
    case '-':
      return sub;
    }
}

int main(void)
{
    int num1, num2;
    char op;
    PTR_TO_FUN fp;
    printf("请输入一个式子(如:1+2):");
    scanf("%d%c%d", &num1, &op, &num2);
    fp = select(op);
    printf("%d %c %d = %d", num1, op, num2, calculate(fp, num1, num2));

    return 0;
}

FishC 发表于 2023-12-28 22:16:22

这个警告的原因是函数`select`中的`switch`语句没有覆盖所有的情况,导致函数在某些分支上没有返回值。为了消除警告,你可以在`switch`语句最后添加一个默认的情况,即`default`分支,返回一个默认的函数指针。

int (*select(char ch))(int, int)
{
    switch (ch)
    {
    case '+':
      return add;
    case '-':
      return sub;
    default:
      return NULL;// 返回一个默认的函数指针
    }
}

这样做可以保证`select`函数在所有情况下都能返回一个合法的函数指针,从而消除警告。当然,如果你对默认情况有其他的处理逻辑,你也可以根据实际需求进行相应的修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

hanghanga 发表于 2023-12-28 22:20:02

FishC 发表于 2023-12-28 22:16
这个警告的原因是函数`select`中的`switch`语句没有覆盖所有的情况,导致函数在某些分支上没有返回值。为了 ...

可是这样的话,一旦输入的不是+或-号,就会导致程序直接停止了。该怎样改进呢?

FishC 发表于 2023-12-28 22:20:15

hanghanga 发表于 2023-12-28 22:20
可是这样的话,一旦输入的不是+或-号,就会导致程序直 ...

如果输入的不是"+"或"-",我们可以在`select`函数中设置一个默认的处理逻辑。例如,你可以返回一个空函数,即一个什么都不做的函数,这样程序就可以继续执行而不会停止。为了实现这个逻辑,我们可以定义一个空函数`empty`,并将其作为默认情况下的返回值。然后在`calculate`函数中,我们可以加入一个判断,如果函数指针为空,则返回0,这样就不会出现异常情况了。以下是修改后的代码:

#include <stdio.h>

typedef int (*PTR_TO_FUN)(int, int);

int add(int, int);
int sub(int, int);

int calculate(PTR_TO_FUN, int, int);
PTR_TO_FUN select(char);

int add(int x, int y){
    return x + y;
}

int sub(int x, int y){
    return x - y;
}

int calculate(PTR_TO_FUN fun, int x, int y){
    if (fun != NULL) {
      return fun(x, y);
    } else {
      printf("输入了无效的操作符!\n");
      return 0;
    }
}

PTR_TO_FUN select(char ch){
    switch (ch){
      case '+':
            return add;
      case '-':
            return sub;
      default:
            printf("输入了无效的操作符!\n");
            return NULL;
    }
}

int main(void){
    int num1, num2;
    char op;
    PTR_TO_FUN fp;

    printf("请输入一个式子(如:1+2):");
    scanf("%d%c%d", &num1, &op, &num2);

    fp = select(op);

    printf("%d %c %d = %d\n", num1, op, num2, calculate(fp, num1, num2));

    return 0;
}

现在,当输入了无效的操作符时,程序会打印出相应的提示信息,并返回0。这样就避免了程序直接停止的情况。请注意,在输入了无效操作符时,输出的结果值为0,这是因为我们在`calculate`函数中设置的默认返回值。你也可以根据实际需求对这部分逻辑进行修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 关于函数返回值警告的问题,怎样消除这个警告?