8

https://github.com/amree/mykad-c/blob/master/scdump.cから C ファイルを実行しようとしましたがInvalid suffix "-252" on integer constant、コードのこの部分に到達し続けます。

        if (RxBuffer[0x11E-252] == 'P')
            printf("Female\n");
        else if (RxBuffer[0x11E-252] == 'L')
            printf("Male\n");
        else
            printf("%c\n", RxBuffer[0x11E-252]);

私はそれが構文に関連していると確信しています。しかし、私はコードを本当に理解していません (理解しようとしていますが、ほとんど行き詰まっています)。誰でも私を助けることができますか?

4

2 に答える 2

12

この問題はある意味で 16 進浮動小数点定数に関連していますが、問題の根本的な原因は 16 進浮動小数点定数0x11Eの開始ではありません (16 進浮動小数点定数の開始ではないため)。

問題は、0x11E-252is のような 3 つのトークンではなく、1 つのトークンであること0x11F-252です。C99 6.4.8 "Preprocessing numbers" を見ると、pp-number トークンが次のようになっていることがわかります。

前処理番号は、オプションでピリオド (.) が先行する数字で始まり、有効な識別子文字と文字シーケンス e+、e-、E+、E-、p+、p-、P+、または P- が続く場合があります。

したがって、0x11E-252単一のトークンであり、トークン化は翻訳フェーズ 3 で発生しますが、トークンを構文的および意味的に解釈するとき (翻訳フェーズ 7 で発生) になると、構文的に有効ではないため、コンパイラ エラーが発生します。

一方、は直前にor (大文字または小文字)がない限り、前処理番号トークンの一部ではない0x11F-252ため、3 つのトークンです。-PE

もちろん、これは float 定数 (16 進数またはその他) に関連しています。これが、-文字が前処理の数値トークンの途中で終了する可能性があるためです。ただし、 16 進浮動小数点定数のようなトークン0xx11Fや似ていないトークンについては、同様のエラー メッセージが表示されることに注意してください。22bad_token

修正は、ouah が指摘-したように、コンパイラがシーケンスを複数のトークンとして処理するように強制するために、の前に空白を挿入することです。これがあなたのコードである場合、より良い解決策は、これらすべてのマジック ナンバー (列挙型またはマクロ) に名前を付けることです。が続く識別子は-、単一のトークンとは見なされません。さらに、コードをもう少し自己文書化するというボーナスが得られることを願っています。

于 2012-08-16T00:06:10.483 に答える
6
0x11E-252

は C の 16 進浮動小数点定数で-252、指数部です。float 定数で整数オブジェクトを初期化しているため、警告が表示されます。

0x11E - 252  // Note the whitespace

整数式です。

後者を使用して、目的の動作を実現します。

編集

私の答えは実際には真実ではありません。修正は問題ありませんが、何が起こっているのかについての実際の説明については、@MichaelBurrからの回答を参照してください。0x11E-252は、C 規則の下で単一のトークンとして読み取られ、有効な浮動 (または整数) 数ではありません。

于 2012-08-15T22:02:25.887 に答える