LINUX.ORG.RU

[C] comparison between signed and unsigned

 


0

3

Как бороться с сабжевым ворнингом?

Т.е. есть, например, хедер в котором объявлена константа uint MAX_DAYS_TO_BIRTHDAY. Она беззнаковая, что, в общем-то, логично, т.к. количество дней не может быть отрицательным. И теперь, если сравнивать ее с результатом функции int days_till_birthday(time_t birthday), то появляется упомянутый ворнинг. Решения, в общем-то, очевидны:

  • Объявить константу как знаковую. Но это не всегда возможно, особенно если либа не твоя, да и в unsigned все-таки содержится подсказка. Можно также не пользоваться по возможности константами, а пользоваться енумами.
  • Вырубить ворнинг ключом компилятора. Спорное решение.
  • Делать каст при каждом таком использовании, что делает код менее читаемым.
  • ???

    Кто как борется с этим?


если результат точно не будет отрицательным, сделай каст.

anonymous
()

>И теперь, если сравнивать ее с результатом функции int days_till_birthday(time_t birthday

А зачем результат функции знаковый?

yoghurt ★★★★★
()

Результат сравнения signed с unsigned может быть очень обескураживащим. Можно вызубрить заковыристые правила из стандарта и писать осторожно, но выглядеть будет неочевидно - лучше так не делать. Если константа unsigned заведомо влезет в signed, то будет проще именно её и скастовать. Более общий способ: сравнить сначала signed переменную с нулём и только если она неотрицальная, то скастовать её к unsigned (точно влезет) и сравнивать с константой.

const86 ★★★★★
()

Собственно, вам принципиально в коде писать uint MAX_DAYS_TO_BIRTHDAY?

У вас такое большое количество дней до дня рождения может быть, что в int не влезает?

delete83 ★★
()

Блин, я тормоз :(

А не пробовали писать #define MAX_DAYS_TO_BIRTHDAY <число>? Вроде такой проблемы не возникает в этом случае...

delete83 ★★
()
Ответ на: комментарий от yoghurt

>А зачем результат функции знаковый?

Пример я выдумал, чтобы вернуть если что код ошибки <0.

gaga
() автор топика
Ответ на: комментарий от const86

Я даже знаю эти правила, но вот все вспоминать каждый раз тяжко. В описанном случае я всегда так и делаю:

int days = days_till_birthday(time(NULL));
if ( days < 0 ) {
  // error
} else {
  if ( days < MAX_DAYS_TO_BIRTHDAY ) { // вот тут ворнинг
    ...
  }
  // ok
}
Суть в том, что каст выглядит уродливо и загромождает код, не неся при этом вообще никакого смысла.

gaga
() автор топика
Ответ на: комментарий от delete83

>А не пробовали писать #define MAX_DAYS_TO_BIRTHDAY <число>?

Я пробовал писать даже enum { MAX_DAYS_TO_BIRTHDAY = X }; Но проблема относится не только к константам. Функции тоже возвращают разные значение, локальные переменные тоже бывают знаковыми и без.

gaga
() автор топика
Ответ на: комментарий от ttnl

угу, сейчас так и делаю. но это некрасиво, кмк.

gaga
() автор топика
Ответ на: комментарий от gaga

А как вы вообще получаете warning? у меня gcc 4.5.2 в MinGW на тестовом файлике молчит, как партизан и все компилирует. Пробовал с опцией -Wall и без. Какие у вас ключики используются? Просто потестировать хочу.

delete83 ★★
()
Ответ на: комментарий от delete83

Это что за новая мода у LORCODE «убивать» нижнее подчеркивание?

Косячит только с тегом [code]

delete83 ★★
()
Ответ на: комментарий от delete83

ога

Ну в общем я понял, что серебряной пули не существует.

Разумным выглядит такой вариант: в качестве целых констант пользоваться enum'ами, избегать переменных где только можно; rоды возврата функций проверять на ноль где целесообразно; все-таки использовать касты в условиях, убедившись, что это можно безопасно сделать.

gaga
() автор топика
Ответ на: комментарий от delete83

дык на дефайнах ворнинга и нет, естественно. Я про константы и переменные писал.

gaga
() автор топика

> Как бороться с сабжевым ворнингом?

Перейти на Java.

bbk123 ★★★★★
()
Ответ на: комментарий от annoynimous

<off> ну, звиняйте — русский не мой основной язык — пытаюсь как могу. обещаю исправитЬся и больше не делатЬ =) </off>

beastie ★★★★★
()

Считаю нужным или приведение результата ф-ции к unsigned (предпочтительно, если у тебя есть такая возможность), или приведение константы к signed (если нельзя изменить ф-цию, и тогда забить на то, что неотрицательная).

Кто как борется с этим?

Если использовать мозги и логику при определнии типов, то касты и не понадобятся.

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.