2013-08-28 6 views
5

stavo attraversando AFNetworking implementazione e ho trovato questoQual è l'avviso di assegnazione-enum in clang?

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wassign-enum" 
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]]; 
#pragma clang diagnostic pop 

(AFHTTPClient:489-492)

L'avvertimento assign-enum è ovviamente in fase di spegnimento, ma mi chiedo che cosa significa.

Qual è l'avviso lanciato da clang in quel caso?

risposta

8

L'avvertimento emesso in assenza dei pragma clang è:

Integer costante non nella gamma di tipo 'NSJSONWritingOptions' elencate (alias 'NSJSONWritingOptions enum')

Guardando la dichiarazione di NSJSONWritingOptions, vediamo che non v'è alcun valore definito per 0:

enum {  NSJSONWritingPrettyPrinted = (1UL << 0) }; typedef NSUInteger NSJSONWritingOptions; 

I documenti suggeriscono di passare 0, ma non esiste un'opzione definita come NSJSONWritingNoOption = 0, e quindi assegniamo una costante (0) a un tipo enum che non definisce 0 come un possibile valore.

+1

Grazie, ora ha senso. Ancora non capisco perché non ci sia qualcosa di simile a 'NSJSONWritingOptionsNone = 0' definito, che probabilmente sarebbe più elegante. Questa è una domanda diversa comunque. +1 –

+0

Ah, sono inciampato su questo sulla strada. Su iPhone – uchuugaka

+0

Da un lato, avere sarebbe inutile dal punto di vista dell'implementazione dell'API: nessuno controllerebbe qualcosa come 'if (passatoInOptions & NSJSONWritingOptionsNone) {// purely default case}' dato che non funzionerà ed è una specie di comunque assurdo. Sarà sempre "if (passedInOptions & NSJSONWritingOptionsCustomStuff) {// fai prima le cose personalizzate} ... // le cose predefinite qui". Ma è sicuramente la pigrizia del design dell'API lasciarlo fuori, proprio per questo motivo. –

0

Se si rimuove il pragma e lo si costruisce, verrà visualizzato l'avviso. Oltre a questo è necessario controllare il manuale del clang.

+0

Ho cercato su Google un po 'di tempo e non sono riuscito a trovare una descrizione di tale avviso. Sarebbe gradito qualsiasi suggerimento alla documentazione pertinente. –

+0

Vedo molti risultati di Google con questo flag. Clang mira a un sacco di compatibilità con GCC e le flag sono molte con molti argomenti. Vedi questo SO post http://stackoverflow.com/questions/7880812/complete-list-of-clang-flags – uchuugaka

+0

Ho già visto quel post. Indica un elenco di clang flags, ma senza descrizione. Mi sto perdendo qualcosa? –