предупреждение: управление достигает конца непустой функции (С++)

я получаю эту ошибку и не могу исправить, я еще нуб, если кто-то может мне помочь, я буду благодарен вам, этот код исходит от xmplayer из libxenon (для jtag xbox)

(я пытаюсь найти похожую ошибку, но не могу найти, что не так)

  int FileSortCallback(const void *f1, const void *f2) {
    /* Special case for implicit directories */
    if (((BROWSERENTRY *) f1)->filename[0] == '.' || ((BROWSERENTRY *) f2)->filename[0] == '.') {
        if (strcmp(((BROWSERENTRY *) f1)->filename, ".") == 0) {
            return -1;
        }
        if (strcmp(((BROWSERENTRY *) f2)->filename, ".") == 0) {
            return 1;
        }
        if (strcmp(((BROWSERENTRY *) f1)->filename, "..") == 0) {
            return -1;
        }
        if (strcmp(((BROWSERENTRY *) f2)->filename, "..") == 0) {
            return 1;
        }
    }

    /* If one is a file and one is a directory the directory is first. */
    if (((BROWSERENTRY *) f1)->isdir && !(((BROWSERENTRY *) f2)->isdir)) return -1;
    if (!(((BROWSERENTRY *) f1)->isdir) && ((BROWSERENTRY *) f2)->isdir) return 1;

    //Ascending Name
    if (XMPlayerCfg.sort_order == 0) {
        return stricmp(((BROWSERENTRY *) f1)->filename, ((BROWSERENTRY *) f2)->filename);
    }
    //Descending Name
    else if (XMPlayerCfg.sort_order == 1) {
        return stricmp(((BROWSERENTRY *) f2)->filename, ((BROWSERENTRY *) f1)->filename);
    }
    //Date Ascending
    else if (XMPlayerCfg.sort_order == 2) {
        if ( ((BROWSERENTRY *) f2)->date == ((BROWSERENTRY *) f1)->date) { //if date is the same order by filename
            return stricmp(((BROWSERENTRY *) f2)->filename, ((BROWSERENTRY *) f1)->filename);
        } else {
            return ((BROWSERENTRY *) f1)->date - ((BROWSERENTRY *) f2)->date;
        }
    }
    //Date Descending
    else if (XMPlayerCfg.sort_order == 3) {
        if ( ((BROWSERENTRY *) f2)->date == ((BROWSERENTRY *) f1)->date) { //if date is the same order by filename
            return stricmp(((BROWSERENTRY *) f1)->filename, ((BROWSERENTRY *) f2)->filename);
        } else {
            return ((BROWSERENTRY *) f2)->date - ((BROWSERENTRY *) f1)->date;
        }
    }
}

person Mesmer Lucas    schedule 04.11.2012    source источник
comment
Кажется, у вас есть последовательность else if, но нет else. Компилятор может зацикливаться на этом, даже если вы обратились ко всем возможным значениям.   -  person chris    schedule 04.11.2012
comment
I am a noob.. вот для начала: Предупреждение не является ошибкой   -  person Aniket Inge    schedule 04.11.2012
comment
@Aniket, это когда ты используешь -Werror. Я знаю, что в заголовке написано предупреждение, но я не удержался.   -  person chris    schedule 04.11.2012
comment
Добавьте return 0 в конце вашей функции   -  person Teemu Ikonen    schedule 04.11.2012
comment
спасибо люди, я попробую исправить с кем-нибудь еще   -  person Mesmer Lucas    schedule 04.11.2012
comment
вернуть 0 исправить проблему спасибо всем   -  person Mesmer Lucas    schedule 04.11.2012
comment
Добавление return 0; в конец функции заглушит предупреждение, но это решит проблему только в том случае, если 0 на самом деле является правильным значением для возврата, если оно достигает этой точки, или если вы можете доказать средствами, недоступными для компилятора, что он никогда не достигнет этой точки.   -  person Keith Thompson    schedule 04.11.2012
comment
Код был бы намного понятнее, если бы он определял пару локальных переменных типа BROWSERENTRY*, инициализированных из f1 и f2, а не везде.   -  person Pete Becker    schedule 04.11.2012


Ответы (1)


Компилятор анализирует ваш код и видит, что инструкция return будет выполняться для всех значений sort_order между 0 и 5 включительно. Однако, если sort_order отрицательное или больше 5, код достигнет конца функции без оператора return; поэтому компилятор выдает предупреждение.

Обратите внимание, что для sort_order может быть невозможно установить отрицательное число или число больше 5 из-за ограничений в других частях вашего кода. Однако компилятор ничего из этого не знает, поэтому он считает, что sort_order может иметь любое значение.

Чтобы решить эту проблему, добавьте в конце оператор безусловного возврата.

person Sergey Kalinichenko    schedule 04.11.2012