2016-03-15 6 views
5

Ho bisogno di utilizzare le enunciate dell'ambito in modo che possa passarle come tipi specifici al nostro serializzatore. Ho dato valori interi espliciti per i membri enum di Enum1.Avviso su gcc supress "troppo piccolo per contenere tutti i valori di"

ho messo due scope enumerazioni corrispondenti alla descrizione di cui sopra in un campo di bit così

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; 
} 

Ora ovunque io uso il tipo Example, ottengo l'avvertimento " 'Esempio :: value1' è troppo piccolo per contenere tutti valori di 'Enum1' ", e allo stesso modo per Enum2. Si noti che questo non è il caso per i valori che abbiamo definito e non ci interessa per tutti con valori al di fuori di questi.

Questa è una distrazione molto grave nel nostro processo di creazione: il progetto è ampio e complesso e non vogliamo dover analizzare molti di questi avvertimenti (e ce ne sono molti).

Ho cercato un flag GCC (G ++) per disabilitare l'avviso specifico. C'è uno che posso passare sulla linea di comando? Idealmente, userei il pragma di avvertimento per disabilitarlo localmente, se possibile.

C'è poco spazio per modificare la struttura del codice a questo punto, ma potremmo davvero utilizzare questi avvisi spuri rimossi.

Grazie in anticipo.

Modifica: aggiunta enumerazione dell'ambito con identificatori modificati.

+1

se Enum1 contiene valori superiori a 3, quindi non si adatta a 2 bit – nikniknik2016

+0

È possibile visualizzare la definizione di 'Enum1' e' Enum2'? – Angew

+0

@ nikniknik2016: Non – jsren

risposta

4

Il problema è che un enumerato con ambito ha sempre un tipo di base integrale. Per impostazione predefinita, è int ma è possibile modificarlo con qualsiasi altro tipo integrale, ad esempio unsigned char.

Purtroppo non è possibile modificare il tipo sottostante in un campo di bit, in quanto non sono veri tipi di C++.

Si potrebbe provare a disabilitare l'avvertimento, ma un rapido sfogliare il codice G ++ rivela queste righe (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); 

La chiave qui è la chiamata alla warning_at(...) invece di warning(OPT_to_disable_the_warning, ...). Quindi al momento non ci sono opzioni per disabilitarlo. Tranne la ricompilazione del compilatore te stesso!

Per quello che vale CLang ++ - 3.7.1 non avvisa a riguardo.

+0

Cheers. Penso che sia un avvertimento utile. Se avesse una descrizione migliore. E davvero solo la prima volta.Il mio problema principale è il fatto che si verifica _più volte_ per ciascun campo e per ogni unità di compilazione. Nonostante l'utilizzo di una sola chiamata g ++. Qual è il modo migliore per sollecitare gli sviluppatori su questo? – jsren

Problemi correlati