Подтвердить что ты не робот

С++: требуется предупреждение для: unsigned int я = -1;

У нас была ошибка в нашем коде, исходящая из строки

unsigned int i = -1;

Когда код был изначально написан, было i = 0 и, следовательно, правильно. Используя -Wall -Wextra, я был немного удивлен тем, что gcc не предупредил меня здесь, потому что -1 не вписывается в unsigned int.

Только при включении -Wsign-conversion эта строка становится предупреждением, но с ней много ложных срабатываний. Я использую стороннюю библиотеку, которая выполняет операции с массивом с подписанными int (хотя они не могут быть < 0), поэтому всякий раз, когда я смешиваю это, например. вектор, я получаю предупреждения - и я не вижу смысла добавлять миллионы призов (и даже сторонние заголовки производят много предупреждений). Поэтому для меня слишком много предупреждений. Все эти предупреждения состоят в том, что преобразование "может изменить знак". Это прекрасно, потому что я знаю, что это происходит не во всех случаях.

Но с назначением, упомянутым выше, я получаю то же предупреждение "может измениться". Разве это не должно быть "обязательно изменит знак!" вместо "может измениться"? Есть ли способ выбросить предупреждения только для этих случаев "изменится", а не для возможных случаев?

4b9b3361

Ответ 1

Инициализировать его фигурными фигурными скобками:

unsigned int i{-1};

Выходы GCC:

main.cpp:3:22: error: narrowing conversion of '-1'
from 'int' to 'unsigned int' inside { } [-Wnarrowing]
     unsigned int i{-1};

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

Ответ 2

Но с назначением, упомянутым выше, я получаю то же предупреждение "может измениться". Разве это не должно быть "обязательно изменит знак!" вместо "может меняться"?

Это странно. Я протестировал несколько версий gcc в диапазоне (4.6 - 5.2), и они дали другое предупреждение для unsigned int i = -1;

предупреждение: отрицательное целое, неявно преобразованное в неподписанный тип [-Wsign-conversion]

Тем не менее, они действительно контролируются тем же самым вариантом, что и изменение предупреждений о знаках, поэтому...

Есть ли способ выбросить предупреждения только для этих случаев "изменится", а не для возможных случаев?

Насколько я знаю, это невозможно. Я уверен, что в компиляторе можно будет реализовать, поэтому, если вы хотите, чтобы отдельный параметр включал предупреждение о назначении отрицательного числа, известного во время компиляции, переменной unsigned, вы можете отправить запрос функции. Однако, поскольку присвоение -1 неподписанной переменной является такой общей и обычно совершенно правильной вещью, я сомневаюсь, что такая функция будет считаться очень важной.