2015-11-23 6 views
11

У нас была ошибка в коде, идущий от линииC++: требуется предупреждение для: unsigned int i = -1;

unsigned int i = -1; 

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

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

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

+1

Даже определенные изменения знака часто используются намеренно. Например, 'std :: string' имеет' static const size_type npos = -1; '. – interjay

+1

[-1 используется с неподписанными типами] (http: // stackoverflow.com/q/22801069/1708801), так как результат полностью определяется стандартом. –

+0

используя unsigned, чтобы убедиться, что переменная не будет отрицательной, является другой ошибкой: D –

ответ

5

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

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};

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

+0

Пожалуйста, предоставьте свои флагов компиляции, чтобы улучшить свой ответ. – YSC

+1

@YSC Это ошибка, поэтому любые флаги будут делать :) – Quentin

+1

Это [плохо сформировано и не требуется быть ошибкой] (http://stackoverflow.com/a/31685448/1708801) –

1

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

Это странно. Я проверил несколько версий GCC в диапазоне (4,6 - 5,2), и они дают различные предупреждения для unsigned int i = -1;

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

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

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

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

+0

Хорошо, спасибо за ответ. Действительно, текст предупреждения отличается. Я просто искал неправильную линию между всеми другими предупреждениями «может». Тогда, похоже, мое предпочтительное решение - использовать все больше и больше переменных 'auto'. – Raubtier

 Смежные вопросы

  • Нет связанных вопросов^_^