Quando provo a compilare il seguente programma C++ utilizzando il compilatore Visual Studio 2010 C++ (X86) con livello di avviso/W4 abilitato, viene visualizzato un avviso di mancata corrispondenza firmato/non firmato linea segnataC++: mancata corrispondenza firmato/non firmato quando si utilizzano solo tipi non firmati
#include <cstdio>
#include <cstdint>
#include <cstddef>
int main(int argc, char **argv)
{
size_t idx = 42;
uint8_t bytesCount = 20;
// warning C4389: '==' : signed/unsigned mismatch
if (bytesCount + 1 == idx)
{
printf("Hello World\n");
}
// no warning
if (bytesCount == idx)
{
printf("Hello World\n");
}
}
Questo mi confonde, dal momento che sto usando solo i tipi senza segno. Dal confronto
bytesCount == idx
non causa tale avviso, probabilmente ha a che fare con una strana conversazione implicita che accade qui.
Quindi: qual è il motivo per cui ricevo questo avviso e in base a quali regole avviene questa conversazione (se questo è il motivo)?
E come dire al compilatore di non avvertirmi di tale problema, se è chiaro dal codice del programma che il confronto è sicuro, ma non voglio disabilitare gli avvertimenti per l'intero file, e non voglio rendere il codice brutto per evitarlo. Esistono modi per raggiungere questo obiettivo? – Arkady
@Arkady Se il compilatore è configurato per avvisare del codice, non si desidera modificare il codice (perché sarà più brutto) e non si desidera modificare la configurazione del compilatore (perché sopprimerà l'utilità avvertenze), non stai lasciando aperte molte opzioni. L'unica opzione che posso pensare di non aver ancora escluso è l'hacking sul compilatore per migliorare la sua analisi. – hvd