Что делать с неправильным предупреждением gcc «управление достигает конца не пустой функции»? - PullRequest
6 голосов
/ 18 января 2009
$ cat t.cpp
int sign(int i) {
    if(i > 0) return 1;
    if(i == 0) return 0;
    if(i < 0) return -1;
}
$ g++ -c t.cpp -Wall
t.cpp: In function ‘int sign(int)’:
t.cpp:5: warning: control reaches end of non-void function
$

Что мне делать с этим?

Прекратить использование -Wall, как это явно неправильно? Добавить фиктивное возвращение 0 в конце? Загромождать код предложениями else?

Ответы [ 4 ]

17 голосов
/ 18 января 2009

Если вы не хотите добавлять предложения «else», потому что они удлиняют код, то, возможно, вы хотели бы удалить последнее «if» и сделать код короче:

int sign(int i) {
    if(i > 0) return 1;
    if(i == 0) return 0;    
    return -1; // i<0
}

Или, если вы действительно «подписываете» себя, и это не упрощение более длинного примера:

int sign(int i) {
    return (i>0) ? 1 : ((i<0)?-1:0);
}
11 голосов
/ 18 января 2009

Ваша sign() функция не очень эффективна. Попробуйте это

int sign(int i) {
    return (i > 0) - (i < 0);
}

Источник: Битовые трюки

5 голосов
/ 18 января 2009

В этом случае я бы выбрал решение:

int sign(int i)
{
    if (i > 0)
        return 1;
    else if (i == 0)
        return 0;    
    else
        return -1; // i<0
}

То есть я бы добавил еще два предложения - чтобы сделать код более симметричным, а не потому, что это имеет какое-либо значение для генерируемого объектного кода.

Я провел некоторые эксперименты. Я ожидал, что однострочная версия, использующая троичный оператор дважды, генерирует тот же код, что и более длинный. Однако тестирование на Solaris 10 (SPARC) с GCC v4.3.2 показывает, что версия троичного оператора последовательно на 12-16 байт меньше, чем версия 'if'. Тем не менее, наличие или отсутствие дополнительного остального не имеет никакого значения. (Добавление регистра не дало никаких шансов, как я и ожидал.) Добавлено Я также посмотрел на решение Кристофа с 'return (i> 0) - (i <0);' - вариант, который я не видел раньше. Размеры кода были: </p>

       Unoptimized     Optimized (-O5)
 if      166             110
 ?:      150              98
 >-<     122              98

Что в основном показывает, что измерение - это хорошая идея!

3 голосов
/ 19 января 2009

else предложения не являются «беспорядком», они являются более очевидным способом определения ваших намерений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...