Сравнение неизвестного типа с отрицательным значением

У меня есть переменная 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 */
Другие вопросы по тегам