Сравнение неизвестного типа с отрицательным значением
У меня есть переменная id
чей тип может варьироваться от платформы к платформе. В нескольких местах существующий код (который я не могу изменить) устанавливает id
до "отрицательного" значения, например
id = -ETIMEDOUT;
На некоторых платформах id
может быть подписано; на других, это может быть без знака. Я хочу проверить, если id
был установлен на -ETIMEDOUT
, Наивная попытка ниже тонко терпит неудачу, когда id
без знака:
if(id == -ETIMEDOUT)
Как я могу кратко проверить это состояние?
2 ответа
@jlahd опубликовал хороший ответ. Я хотел бы предложить альтернативу, хотя.
if (id == (typeof(id)) -ETIMEDOUT)
Я думаю, что это будет похоже, но есть проблема с этим. Это не в стандарте C и является расширением GCC.
Вы можете прочитать немного больше об этом здесь
Дословная цитата из комментария @rici:
Поскольку вы, вероятно, знаете какой-то typedef, который работает как тип id, вы, вероятно, можете сделать это без typeof, хотя это и чище. Тем не менее, это должно быть
(typeof(id))(-ETIMEDOUT)
(круглые скобки вокруг -ETIMEDOUT просто косметические, но требуется унарный минус.) В качестве альтернативы следующее должно быть довольно надежным:
if (-id == ETIMEDOUT)
поскольку, если id подписан, это, очевидно, работает; если id не подписан, то унарный минус имеет четко определенное поведение.
Попробуй это:
id += ETIMEDOUT;
if(id == 0) { /* timed out */ }
id -= ETIMEDOUT; /* if you need to keep id untouched */