Приведите ssize_t или size_t

В исходных файлах, которые я использую в своем проекте, есть сравнение между 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){...}

Что безопаснее, лучше, чище? Спасибо

9

Решение

На этот вопрос нет единственно правильного ответа. Есть несколько возможных ответов, в зависимости от того, что вы знаете априори о значениях, которые могут принимать эти переменные.

  • Если вы знаете, что sst неотрицателен, то смело можете разыгрывать sst в size_t, поскольку это не изменит значение (кстати, это то, что происходит, если у вас нет приведения вообще).

  • Если sst может быть отрицательным, но вы знаете, что st никогда не будет больше чем SSIZE_MAX, тогда вы можете спокойно бросить st в ssize_t, так как это не изменит значение.

  • Если sst может быть отрицательным, и st может быть больше, чем SSIZE_MAXтогда ни один акт не является правильным; любой из них может изменить значение, что приведет к неправильному сравнению. Вместо этого вы бы сделали следующее if (sst >= 0 && (size_t)sst == st),

Если вы не абсолютно уверен что применима одна из первых двух ситуаций, выберите третий вариант, так как он верен во всех случаях.

19

Другие решения

Любой из них будет работать нормально, если оба значения находятся в положительном представимом диапазоне ssize_t,

Если любое значение не, у вас могут возникнуть проблемы — проверьте эти случаи перед проверкой на равенство:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}

(Я уверен, что люди C ++ порекомендуют вам полностью избегать приведения в стиле C — я не сомневаюсь, что кто-то прокомментирует или ответит, и сообщит вам правильный способ сделать это в C ++.)

3

По вопросам рекламы [email protected]