Когда я пытаюсь скомпилировать следующую программу на C++ с использованием компилятора Visual Studio 2010 C++ (X86) с включенным уровнем предупреждения/W4, я получаю предупреждение о несоответствии с подписью/без знака на отмеченная строка.C++: несоответствие подписи/без знака при использовании неподписанных типов
#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");
}
}
Это меня смущает, поскольку я использую только неподписанные типы. Поскольку сравнение
bytesCount == idx
не вызывает такого предупреждения, возможно, это связано с каким-то странным неявным разговором, который здесь происходит.
Таким образом: по какой причине я получаю это предупреждение и по каким правилам происходит этот разговор (если это причина)?
И как сообщить компилятору, чтобы он не предупреждал меня о такой проблеме, если из кода программы видно, что сравнение безопасно, но я не хочу отключать предупреждения для всего файла, и я не хочу делать код уродливым чтобы избежать этого. Существуют ли какие-либо способы достижения этого? – Arkady
@Arkady Если компилятор настроен на предупреждение для кода, вы не хотите менять код (потому что он будет более уродливым), и вы не хотите изменять конфигурацию компилятора (потому что он будет подавлять полезные предупреждения тоже), вы не оставляете много вариантов открытыми. Единственный вариант, о котором я могу думать, что вы еще не исключили, - это взломать компилятор, чтобы улучшить его анализ. – hvd