VS2005+WinSock: предупреждение C4018: '‹': несоответствие со знаком/без знака

Мне не удается удалить warning C4018: '<' : signed/unsigned mismatch из этого кода:

SOCKET s;
fd_set set;
FD_CLR(s,&set);

Мне кажется, что проблема в реализации VS2005 FD_CLR, и на самом деле это не большая проблема, просто довольно раздражает. Существует ли портативная эквивалентная версия этого кода, которая не выдает предупреждений? (ПРИМЕЧАНИЕ: я знаю, что есть #pragma для отключения предупреждения. Я также знаю, что макрос FD_CLR действительно работает отлично. Я просто ищу способ написать код без предупреждений)

РЕДАКТИРОВАТЬ: В конце концов, я обнаружил, что происходит: сторонний .h содержит (НЕПРАВИЛЬНО!!!) переопределение «u_int» как «int». Вот почему компилятор жалуется на сравнение между u_int внутри FD_CLR. Мне стыдно.


person Giuseppe Guerrini    schedule 14.11.2012    source источник
comment
Единственная возможность, которую я вижу, это привести s к int (FD_CLR( (int)s, &set );) и посмотреть, изменит ли это что-нибудь. Все остальное будет ковыряться во FD_CLR внутренностях или нарушать его декларацию (т. е. лечить хуже, чем болезнь). Если подумать, вы могли бы написать оболочку для FD_CLR, которая локально отключает это конкретное предупреждение.   -  person DevSolar    schedule 14.11.2012
comment
Этот код выглядит нормально, и у меня никогда не было предупреждения об использовании макроса FD_CLR в старых или новых версиях VS. Вы уверены, что именно в этой строке ошибка?   -  person Some programmer dude    schedule 14.11.2012
comment
@DevSolar Изменение типа s не решает. К сожалению проблема внутри макроса. Но написание оболочки для FD_CLR - это чистое решение, бонус для вас, если вы опубликуете его как истинный ответ.   -  person Giuseppe Guerrini    schedule 14.11.2012
comment
@Joachim Pileborg да, протестировано также с помощью программы тестирования деревьев. Вероятно, это зависит от уровня SP VS2005 (у меня 2.0.50727 SP2).   -  person Giuseppe Guerrini    schedule 14.11.2012


Ответы (2)


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

person DevSolar    schedule 14.11.2012

Возможно, вы можете переписать макрос FD_CLR и изменить переменную цикла int/uint, но это приведет к предупреждению о переопределении макроса. Я думаю, #pragma лучше.

person acadia    schedule 14.11.2012