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

Не успявам да премахна warning C4018: '<' : signed/unsigned mismatch от този код:

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

Струва ми се, че проблемът е в изпълнението на FD_CLR на VS2005 и всъщност не е голям проблем, просто е доста досадно. Има ли преносима еквивалентна версия на този код, която не извежда предупреждения? (ЗАБЕЛЕЖКА: Знам, че има #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 да, тествано също с програма за тестване на дървовидна линия. Вероятно зависи от нивото на VS2005 SP (моето е 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