【问题标题】:warning: control reaches end of non-void function [-Wreturn-type]警告:控制到达非空函数的结尾 [-Wreturn-type]
【发布时间】:2016-08-13 22:27:04
【问题描述】:

我得到了一段代码:

int check(int d, char arr[9][9], int rep_arr[45][3]) {

    int p = findProb(d, arr, rep_arr, 0) ;

    if (isIdeal(d, arr) == 1) {

            print_array(d,arr) ;

            return 1 ;

    }

    else if(isIdeal(d,arr) == 0 && p == 0){

            printf("Fail\n") ;

            return 0 ;

    }

    else if (isIdeal(d, arr) == 0 && p != 0) {

            #do something recursively..
    }

其中isIdeal(d, arr) 只能等于01,而p 可以等于0 或其他整数。 但是,编译器给了我标题中给出的错误。

后来我在那段代码的末尾添加了return 0

现在它可以工作,但不能以函数方式工作,因为函数返回的内容非常重要。

另一个关键的事情是,当我添加一个else 块以避免在该站点上的另一个主题see more at link 上指示失败时,它从未进入该else 块。但是无论我是否添加@,它总是return 0 987654333@ 块与否,通过这种方式,所有可能性都以return 行结束。怎么样?

【问题讨论】:

  • 如果case1 不是10 会发生什么。
  • 编译器无法判断case1 的值只能是01。如果传递的参数是2,那么它会从函数的末尾掉下来,这就是为什么它会警告你这个问题。
  • 如果你告诉我们的是真的,那么在函数末尾添加return 0 对程序的行为没有影响(因为它永远不会到达。)
  • 我的下一个猜测是你的真实函数涉及递归,然后当递归调用返回时继续到函数的末尾。那是 return 0 影响行为的时候。

标签: c function return void


【解决方案1】:

如果您确定可能的值,则可以将整个函数替换为:

int foo(int case1, int case2) {
    if (case1 == 1) {
        return val;
    }
    return case2 == 0 ? val2 : val3;
}

同时使您的警告静音。

如果您担心case1 可能不是10,那么只需更改为:

int foo(int case1, int case2) {
    assert(case1 == 0 || case1 == 1);

    if (case1 == 1) {
        return val;
    }
    return case2 == 0 ? val2 : val3;
}

【讨论】:

  • 我可能会选择第二种实现方式。我要做的唯一更改是函数上方的一些 doc cmets,记录 case1 必须是 01(或将 case1 的类型更改为布尔值或枚举)这一事实。
【解决方案2】:

编译器不知道case1case2 参数的值是什么。您的 if 条件无法处理这些参数可能包含的所有可能值(忽略您可能只传入 1 和 0)。因此,编译器会正确地警告您,您可以在不返回任何内容的情况下到达函数的末尾。

如果您确实确定这永远不会发生,请将其转换为运行时错误并在函数末尾放置一个断言(您可能仍需要在断言之后返回以使警告静音,我不确定)。

int foo(case1, case2) {
    // your if conditions here

    assert(0);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多