2012-05-17 60 views
2

我想編譯一些我在網上找到的代碼,但gcc不停地收到我的錯誤消息。強制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]); 

...

在這裏第一次發帖,所以如果我打破任何規則或不夠具體,讓我知道。

+1

這是一個很好的問題,但對人不對事的攻擊是不能容忍的 - 比如評論「或者也許它是你誰擁有的ASCII轉義字符認識不足?」 –

+1

OP,你已經解釋了你的代碼出了什麼問題,並且你的迴應是傲慢地聲稱人們幫助你不知道他們在做什麼。這種態度是不會讓你遠在SO ... –

回答

3

您不能忽略錯誤。你只能忽略警告。更改代碼。

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

這只是一種猜測,因爲沒有從代碼的原作者文檔或輸入,我們有什麼樣的代碼實際上是應該做的事沒有確鑿的證據。然而,上述更正是非常合理,這是一個簡單的錯字(原作者忘記了\),並且可以想象,作者使用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 

所以,你知道無論是原作者只是typo'd和忘記一個\(我犯類似的錯誤所有時間),或作者沒有線索。

注:

:一個錯誤意味着GCC不知道什麼的代碼是應該做的,因此繼續是不可能的。

+2

您_can_忽略警告,但是,這並不意味着你_should_ :-) – paxdiablo

+2

也許你* *可以忽略警告,我用'-Werror': - ) –

+0

是不是隻打印出「\ x42」(例子)而不是一個字符呢? – dcat

2

看起來你想添加一個前綴x到十六進制數。如果是的話,你可以刪除\

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

您得到錯誤的原因是\x馬克一個十六進制轉義序列的開始。

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

打印

COOL 

作爲C具有0x43 ASCII值。

但你的情況\x後面沒有十六進制數字導致解析錯誤。你可以看到C syntax here上面清清楚楚地寫着:

hex-escape ::= \x hex-digit ∗ 
+0

儘管代碼運行時,它**後面會跟着兩個動態數字。 – dcat

+2

@ JackN.White:你需要明白,你不能有這樣一個動態構建的字符串。它必須是**常數**。 – codaddict

1

逃離\另一個\

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

順便說一句,你不能強迫GCC繼續編譯錯誤之後,因爲作爲誤差一個錯誤,因爲它阻止了對不可能解決的源代碼的進一步邏輯分析。