В исходных файлах, которые я использую в своем проекте, есть сравнение между ssize_t
а также size_t
переменные:
ssize_t sst;
size_t st;
if(sst == st){...}
Я хотел бы избавиться от предупреждения:
warning: comparison between signed and unsigned integer expressions
Но я не уверен, какую переменную я должен привести к другой?
if((size_t)sst == st){...}
или же
if(sst == (ssize_t)st){...}
Что безопаснее, лучше, чище? Спасибо
На этот вопрос нет единственно правильного ответа. Есть несколько возможных ответов, в зависимости от того, что вы знаете априори о значениях, которые могут принимать эти переменные.
Если вы знаете, что sst
неотрицателен, то смело можете разыгрывать sst
в size_t
, поскольку это не изменит значение (кстати, это то, что происходит, если у вас нет приведения вообще).
Если sst
может быть отрицательным, но вы знаете, что st
никогда не будет больше чем SSIZE_MAX
, тогда вы можете спокойно бросить st
в ssize_t
, так как это не изменит значение.
Если sst
может быть отрицательным, и st
может быть больше, чем SSIZE_MAX
тогда ни один акт не является правильным; любой из них может изменить значение, что приведет к неправильному сравнению. Вместо этого вы бы сделали следующее if (sst >= 0 && (size_t)sst == st)
,
Если вы не абсолютно уверен что применима одна из первых двух ситуаций, выберите третий вариант, так как он верен во всех случаях.
Любой из них будет работать нормально, если оба значения находятся в положительном представимом диапазоне ssize_t
,
Если любое значение не, у вас могут возникнуть проблемы — проверьте эти случаи перед проверкой на равенство:
if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}
(Я уверен, что люди C ++ порекомендуют вам полностью избегать приведения в стиле C — я не сомневаюсь, что кто-то прокомментирует или ответит, и сообщит вам правильный способ сделать это в C ++.)