2011-10-13 199 views
24

爲什麼這是警告?我認爲在很多情況下,使用多字符int常量而不是「無意義」數字或者使用相同值定義const變量時會更清楚。當解析wave/tiff /其他文件類型更清楚地將讀取值與某些'EVAW','data'等比較,而不是相應的值。多字符常量警告

示例代碼:

int waveHeader = 'EVAW'; 

爲什麼會出現這種給予警告?

+0

我無法理解您的問題。你能說清楚嗎? – 2011-10-13 13:56:26

+0

@ 0A0D我會試試:)對不起 – Felics

+0

相關:http:// stackoverflow。com/questions/7497192/enum-constants-questions –

回答

28

According to the standard(§6.4.4.4/ 10)

包含多於一個 字符的整數字符常數的值(例如, 'AB'),[...]是實現定義。

long x = '\xde\xad\xbe\xef'; // yes, single quotes 

這是有效的ISO 9899:2011 C.它編譯沒有與-Wallgcc下警告,「多字符常量」與-pedantic警告。

Wikipedia

多字符常量(例如「XY」)是有效的,雖然很少 有用 - 一個整數,他們讓一個店幾個字符(例如,4個 ASCII字符可以適合在32位整數,8位爲64位)。 由於字符被打包到一個int中的順序不是指定的 ,所以便攜式使用多字符常量很困難。

爲了便於攜帶,請不要在整數類型中使用多字符常量。

+3

我不確定最後一句話的含義是什麼;多字符常量總是具有整型(並且這種不帶前綴的常量總是具有類型「int」)。 –

12

此警告對於錯誤地編寫'test'他們應該寫入"test"的程序員很有用。

這比發生實際需要多字符int常量的程序員更經常發生。

+2

這是一個很好的例子,但是當我真的想寫'test'並且我有警告時會發生什麼。我不會在我的代碼中發出任何警告... – Felics

+0

您必須應對警告,或者找到您的編譯器選項來禁用此特定警告(這可能會在代碼中的其他地方傷害您;-))。 –

+1

另一個意外的程序員錯誤是錯誤地記錄了十六進制轉義的語法,並且當一個意思是'\ x61'時寫'\ 0x61'。 – tml

11

如果感到幸福你知道你在做什麼,並能接受的便攜性問題,海合會例如,你可以禁用命令行警告:

-Wno-multichar 

我用這個我自己由於類似的原因,應用程序可以使用AVI和MP4文件標題。

3

即使您願意查看您的實現定義的行爲,多字符常量仍然隨字節順序而變化。

更好地使用(POD)struct {char [4]}; ...然後使用像「WAVE」_4cc這樣的UDL輕鬆構建該類的實例

相關問題