3

オンラインで見つけたコードをコンパイルしようとしていますが、gcc でエラー メッセージが表示され続けます。

エラーを回避してコンパイルする方法はありますか?

ttys000$ gcc -o s-proc s-proc.c 
s-proc.c:84:18: error: \x used with no following hex digits

これは、それが愚痴をこぼし続ける行です:

printf("\x%02x", ((unsigned char *)code)[i]);

...

ここに初めて投稿するので、ルールを破ったり、具体的でなかったりした場合はお知らせください。

4

3 に答える 3

3

エラーを無視することはできません1。警告は無視することしかできません。コードを変更します。

printf("\\x%02x", ((unsigned char *)code)[i]);

ドキュメントやコードの元の作成者からの入力がなければ、コードが実際に何をすべきかについて確固たる証拠がないため、これは推測にすぎませんただし、上記の修正は非常にもっともらしく、単純なタイプミス (元の作成者は a を忘れていました\) であり、エラーを黙って無視する C コンパイラを作成者が使用していると考えられます (Python は設計上同じ動作をします)。

上記のコード行、またはそれとほぼ同じコード行は、おそらく世界中の何万ものソース ファイルに含まれています。これは、エスケープ シーケンスを使用してバイナリ blob をエンコードするために使用されるため、C プログラムにリテラルとして埋め込むことができます。同様のコードが JSON、XML、および HTML エミッターに表示されます。たぶん百回は書いた。

あるいは、コードが文字を出力することになっていた場合、これは機能しません。

printf("\x%02x", ((unsigned char *)code)[i]);

これは機能しません。エスケープ シーケンス ( などで始まるもの\)\x42は C コンパイラによって処理されますが、フォーマット文字列 ( などで始まるもの%)%02xは によって処理されprintfます。上記のコード行は、順序が逆の場合にのみ機能する可能性があります。つまり、プログラムをコンパイルする前にprintf最初に実行した場合です。いいえ、うまくいきません。

著者が文字通りの文字を書くことを意図していた場合、次のほうがより妥当です。

printf("%c", ((unsigned char *)code)[i]);  // clumsy
putchar((unsigned char *)code)[i]);        // simpler

したがって、元の作成者が単にタイプミスして 1 つを忘れた\(私はいつもその間違いを犯します) か、作成者が手がかりがないかのいずれかを知っています。

ノート:

1 : エラーは、GCC がコードが何をすべきかを認識していないことを意味するため、続行することはできませ

于 2012-05-17T06:58:18.190 に答える
2

x16 進数に接頭辞を追加したいようです。はいの場合は、次のものを削除できます\

printf("x%02x", ((unsigned char *)code)[i]);

エラーが発生する理由\xは、16 進エスケープ シーケンスの開始を示しているためです。

例:printf("\x43\x4f\x4f\x4c");

版画

COOL

AsCの ASCII 値は0x43.

しかし、あなたの場合、の\x後に16進数が続かないため、解析エラーが発生します。ここで C 構文を見ることができます。

hex-escape   ::=    \x hex-digit ∗
于 2012-05-17T06:59:17.800 に答える
1

\ を別の \ でエスケープする

printf("\\x%02x", ((unsigned char *)code)[i]);

ところで、GCC にエラーの後にコンパイルを続行させることはできません。なぜなら、エラーはエラーであり、解決できないソース コードのさらなる論理分析を妨げるからです。

于 2012-05-17T06:59:18.740 に答える