警告:控制到达非空函数的末尾[-Wreturn-type]

时间:2016-04-21 00:14:17

标签: c function return void

我得到了一段代码:

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)只能等于01p可以等于0或其他整数。 但是,编译器给出了标题中给出的错误。

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

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

另一个重要的事情是,当我添加else块以避免在该网站see more at link上的其他主题上显示的失败时,它永远不会输入else块。但它总是{{ 1}}我是否添加return 0块,通过哪种方式,所有可能性都以else行结束。怎么样?

2 个答案:

答案 0 :(得分:3)

如果您确定可能的值,那么您可以用以下内容替换整个函数:

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;
}

答案 1 :(得分:0)

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

如果您确实不应该发生这种情况,请将其转换为运行时错误并在函数结束时放置一个断言(您可能仍需要在断言后返回以使警告静音,我不确定)。

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

    assert(0);
    return 0;
}