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]);

这只是一个猜测,因为没有文档或代码原作者的输入,我们没有确凿的证据证明代码实际上应该做什么。但是,上面的更正是非常合理的,这是一个简单的错字(原作者忘记了一个\),并且可以想象作者使用了一个默默地忽略错误的 C 编译器(Python 在设计上具有相同的行为)。

上面的代码行,或者几乎完全相同的代码行,在全球可能有数万个源文件中都可以找到。它用于使用转义序列对二进制 blob 进行编码,因此可以将其作为文字嵌入到 C 程序中。类似的代码出现在 JSON、XML 和 HTML 发射器中。我可能已经写了一百遍了。

或者,如果代码应该打印出字符,这将不起作用:

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

这不起作用,因为转义序列(以\, like开头的东西\x42)由 C 编译器处理,但格式字符串(以%, like开头的东西%02x)由printf. 上述代码行可能仅在顺序颠倒时才有效:如果printf先运行,则在编译程序之前。所以不,它不起作用。

如果作者打算写文字字符,则以下内容更合理:

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

所以你要么知道原作者只是打错了,忘记了一个\(我一直犯那个错误,要么作者不知道。

笔记:

1:错误意味着 GCC 不知道代码应该做什么,因此无法继续。

于 2012-05-17T06:58:18.190 回答
2

看起来您想为x十六进制数字添加前缀。如果是,您可以删除\

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

您收到错误的原因是\x标记十六进制转义序列的开始。

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

印刷

COOL

AsC的 ASCII 值为0x43.

但是在您的情况下,\x后面没有十六进制数字,这会导致解析错误。您可以在这里看到 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 回答