У меня возникли проблемы, которые я уверен, что это легко исправить, но я в растерянности ...Закрепление «Сравнение всегда ложно ...» предупреждение в GCC
У меня есть шаблон, выполняет следующий код:
T value = d;
if (std::numeric_limits<T>::is_signed)
{
if (value < 0)
{
*this += _T("-");
value = -(signed)value;
}
}
Теперь, очевидные причины, GCC дает мне предупреждение (сравнения всегда ложно из-за ограниченный диапазон типа данных), когда этот код компилируются для неподписанного типа. Я полностью понимаю аргументы позади этого, и я ввел проверку numeric_limits, чтобы узнать, могу ли я заставить компилятор заткнуться (он работал для MSVC). Увы, в GCC я получаю предупреждение. Есть ли способ (если не отключить предупреждение, которое я даже не знаю, если вы можете сделать с GCC), чтобы исправить это предупреждение? Код никогда не будет вызван в любом случае, и я бы предположил, что оптимизатор тоже его скомпилирует, но я не могу избавиться от предупреждения.
Может ли кто-нибудь дать мне решение?
Cheers!
Это ОЧЕНЬ неприятно, когда 'int' - 16 бит. Когда 'value' является длинным, значение value = - (signed/* int * /) усекает большие значения. Умножьте на '-1' вместо этого, и пусть оптимизатор это выяснит. – MSalters