2017-01-31 218 views
5

我需要一些未簽名的32位枚舉值我的軟件,所以我實現了這個(簡單的)枚舉:ç枚舉與32位值

enum{ 
    val1 = 0xFFFFFFFFu, 
    val2 = 0xFFFFFFFEu, 
    val3 = 0xFFFFFFF0 
}; 

問題:每次我編譯運行時,Eclipse將中止編譯和標記帶有以下錯誤的枚舉:
enter image description here
在我的看法中,32 int值不應該是枚舉的問題,但顯然它似乎是。 我會約一些輸入:)感謝

[更新1:]我將嘗試找到在編譯器設置的問題,我將繼續爲您提供最新

+0

arent'tÇ進行枚舉簽署值? –

+2

這是抱怨,因爲你試圖使用一個無符號的文字爲一個有符號的整數。 –

+0

不幸的是,刪除'u'後它仍然不起作用(同樣的錯誤) –

回答

4

枚舉常量val1在你的例子)被要求是C標準的int。這是一種簽名類型,在32位系統上,值FFFFFFFF不適合它。因此該值將以某種實現定義(編譯器特定)方式轉換爲有符號整數。如果這不能完成,你會得到一個實現定義的信號。

編寫依賴於此的代碼很糟糕,因爲它是不可移植且不可預知的。沒有可以解決這個問題的編譯器設置,因爲這是通過語言設計的。

我相信gcc標誌-pedantic/-pedantic-errors可以被刪除,以擺脫警告,但這是一個壞主意,因爲你將不再遵循標準的C. gcc在其默認的非標準「臭鼬模式「-std=gnu90-std=gnu11將編譯代碼,如同任何-std=cxx而不是-pedantic-errors

這就是爲什麼枚舉不適用於任何形式的位掩碼或按位操作的原因。

最好的解決方案是擺脫枚舉並使用#defineconst uint32_t,以最適合您的特定場景的爲準。

+1

它們適用於不使用符號位的位掩碼 –

+0

我還沒有找到任何編譯器用'-pedantic-errors'抱怨OP的代碼事件。我想知道爲了得到該代碼的警告/錯誤,我們需要放置哪個標誌。 –

+1

@ M.M不,他們真的不是,例如考慮'mask << n'或'〜mask' – Lundin

3

您是否嘗試過這個?:

enum { 
    val1 = (int)0xFFFFFFFFu, 
    val2 = (int)0xFFFFFFFEu, 
    val3 = (int)0xFFFFFFF0 
}; 

編輯:我剛裝上的GCC Cygwin和嘗試了這一點。

測試enum.c是原始版本,測試枚舉int.c的一個用明確的轉換:

$ cc -std=c11 -pedantic-errors -c test-enum.c 
test-enum.c:2:8: error: ISO C restricts enumerator values to range of 'int' [-Wpedantic] 
    val1 = 0xFFFFFFFFu, 
     ^
test-enum.c:3:8: error: ISO C restricts enumerator values to range of 'int' [-Wpedantic] 
    val2 = 0xFFFFFFFEu, 
     ^
test-enum.c:4:8: error: ISO C restricts enumerator values to range of 'int' [-Wpedantic] 
    val3 = 0xFFFFFFF0u 
     ^

$ cc -std=c11 -pedantic-errors -c test-enum-int.c 

(無投訴)

$ cc --version 
cc (GCC) 5.4.0 
Copyright (C) 2015 Free Software Foundation, Inc. 
+0

這意味着完全一樣的東西。警告是有原因的。 – Lundin

+0

@Lundin恕我直言,這不完全是一回事。然而,我同意以這種方式強制C編譯器應該小心謹慎,並且可能會限制可移植性。 – Scheff

+0

演員陣容肯定會改變價值。該標準只允許它明確地完成。請注意,轉換是實現定義的;我們默認了兩個補碼。 – Potatoswatter