В чем смысл предупреждения GCC: «Значение метки регистра превышает максимальное значение для типа»?
-
06-07-2019 - |
Вопрос
Мой код выглядит следующим образом:
char * decode_input(char ch)
{
switch(ch) {
case 'g':
return "get";
break;
case KEY_F(9):
return "quit";
break;
default:
return "unknown";
break;
}
}
Есть какие-нибудь подсказки?
Решение
Символ — это число от -128 до 127.KEY_F(9), вероятно, находится за пределами этого диапазона.
Использовать:
- беззнаковый символ или
- интервал или
- (символ) KEY_F(9)
Или, что еще лучше, используйте отладчик и определите sizeof(KEY_F(9)), чтобы убедиться, что это байт, а не короткий.
Другие советы
Ну, KEY_F (9) будет 273 (см. curses.h), что превышает диапазон char (-128,127).
В этом случае KEY_F (9)
оценивает что-то вне диапазона char
. Оператор switch
предполагает, что, поскольку его аргумент является char
, все метки регистра также будут. Изменение switch
на чтение switch ((unsigned int) ch)
вылечит его.
Похоже, что KEY_F (9) должен вычислять что-то, что находится вне диапазона символа.
Что все остальные говорили о диапазоне для символа.
Я помню это с первых дней написания C ... вы, вероятно, вызываете decode_input из цикла, верно? Если пользователь нажимает что-то вроде F9, вы получите два байта в буфере клавиатуры - и первый байт будет 0x0.