GCC警告“ケースラベル値がタイプの最大値を超えている意味は何ですか?

StackOverflow https://stackoverflow.com/questions/1010966

質問

私のコードは次のようになります:

char * decode_input(char ch)
{
        switch(ch) {
                case 'g':
                        return "get";
                        break;
                case KEY_F(9):
                        return "quit";
                        break;
                default:
                        return "unknown";
                        break;
        }
}

手がかりはありますか

役に立ちましたか?

解決

charは-128〜127の数値です。KEY_F(9)はおそらくその範囲外の値です。

使用:

  • unsigned char、または
  • int、または
  • (char)KEY_F(9)

さらに良いのは、デバッガを使用してsizeof(KEY_F(9))を決定し、それがバイトではなくショートであることを確認することです。

他のヒント

まあ、KEY_F(9)は273(curses.hを参照)になり、charの範囲(-128,127)を超えます。

この場合、 KEY_F(9) char の範囲外に評価されます。 switch ステートメントは、引数が char であるため、すべてのケースラベルも同じであると想定しています。 switch((unsigned int)ch)を読み取るように switch を変更すると、それが修正されます。

KEY_F(9)はcharの範囲外にあるものに評価する必要があるようです。

charの範囲に関して他の誰もが言ったこと。

Cを書いた初期の頃からこれを覚えています...おそらくループからdecode_inputを呼び出しているのでしょうか?ユーザーがF9などを押すと、キーボードバッファーに2バイトが追加されます。最初のバイトは0x0になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top