2016-03-15 21 views
5

我需要使用範圍枚舉,以便我們可以將它們作爲特定類型傳遞給我們的序列化程序。我爲Enum1的枚舉成員給出了明確的整數值。gcc禁止警告「太小,不能保存所有值」

我已經放了兩個範圍的枚舉匹配上面的描述成一個位域從而

enum class Enum1 { 
    value1 = 0x0, 
    value2 = 0x1, 
    value3 = 0x2 
}; 
enum class Enum2 { 
    value1 = 0x0, 
    value2, 
    value3, 
// ... 
    value14 
}; 

struct Example { 
    Enum1 value1 : 2; 
    Enum2 value2 : 6; 
} 

現在,無論我用Example類型,我得到警告「‘例子::值1’太小,無法容納所有'Enum1'的值,以及Enum2。請注意,對於我們已定義的值,情況並非如此,我們並不關心的所有,其值超出這些值。

在我們的構建過程中,這是一個非常嚴重的干擾 - 該項目非常龐大且複雜,我們不希望通過這些警告中的許多警告進行掃描(並且有很多)。

我看了一個GCC(G ++)標誌來禁用特定的警告。有沒有可以通過命令行傳遞的東西?理想情況下,如果可能,我會使用警告雜注在本地將其禁用。

在這一點上改變代碼結構的餘地很小,但我們可以真正使用這些虛假的警告消除。

在此先感謝。

編輯:添加標識符已更改的範圍枚舉。

+1

如果Enum1包含的值大於3,那麼它將不適合2位 – nikniknik2016

+0

您可以顯示「Enum1」和「Enum2」的定義嗎? – Angew

+0

@ nikniknik2016:它不會 – jsren

回答

4

問題是,作用域枚舉總是有一個整體的基礎類型。默認情況下,它是int,但您可以將其更改爲任何其他整數類型,例如unsigned char

不幸的是,您不能將底層類型更改爲位域,因爲它們不是真正的C++類型。

你可以嘗試禁用警告,但快速脫脂通過G ++代碼揭示了這些行(gcc/cp/class.c:3468):

else if (TREE_CODE (type) == ENUMERAL_TYPE 
      && (0 > (compare_tree_int 
        (w, TYPE_PRECISION (ENUM_UNDERLYING_TYPE (type)))))) 
    warning_at (DECL_SOURCE_LOCATION (field), 0, 
       "%qD is too small to hold all values of %q#T", 
       field, type); 

這裏的關鍵是調用warning_at(...)而不是warning(OPT_to_disable_the_warning, ...)。所以目前沒有選擇禁用它。除了自己重新編譯編譯器!

什麼是值得的CLang ++ - 3.7.1並沒有警告它。

+0

乾杯。 Tbh我認爲這是一個有用的警告。如果它有更好的描述。而且只是第一次。我的主要問題是每個字段和每個編譯單元出現_multiple times_。儘管只使用一個g ++調用。刺激開發者的最佳方式是什麼? – jsren