С++: требуется предупреждение для: unsigned int я = -1;
У нас была ошибка в нашем коде, исходящая из строки
unsigned int i = -1;
Когда код был изначально написан, было i = 0
и, следовательно, правильно.
Используя -Wall -Wextra
, я был немного удивлен тем, что gcc не предупредил меня здесь, потому что -1 не вписывается в unsigned int.
Только при включении -Wsign-conversion
эта строка становится предупреждением, но с ней много ложных срабатываний. Я использую стороннюю библиотеку, которая выполняет операции с массивом с подписанными int (хотя они не могут быть < 0), поэтому всякий раз, когда я смешиваю это, например. вектор, я получаю предупреждения - и я не вижу смысла добавлять миллионы призов (и даже сторонние заголовки производят много предупреждений). Поэтому для меня слишком много предупреждений. Все эти предупреждения состоят в том, что преобразование "может изменить знак". Это прекрасно, потому что я знаю, что это происходит не во всех случаях.
Но с назначением, упомянутым выше, я получаю то же предупреждение "может измениться". Разве это не должно быть "обязательно изменит знак!" вместо "может измениться"? Есть ли способ выбросить предупреждения только для этих случаев "изменится", а не для возможных случаев?
Ответы
Ответ 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
неподписанной переменной является такой общей и обычно совершенно правильной вещью, я сомневаюсь, что такая функция будет считаться очень важной.