2016-02-10 8 views
5

C'è un motivo per l'avviso here, ma questo non riesce a rispondere all'intera immagine. Ad esempio, il codice seguente fa scattare l'allarme:Qual è lo scopo di -Wbad-function-cast, perché si applica solo al valore di ritorno diretto?

(int)round(M_PI); 

, ma d'altra parte il seguente codice non lo fa:

double d; 
(int)(d = round(M_PI)); 

questo non lo fa neanche:

(int)M_PI; 

la logica era che non dovresti convertire in int semplicemente lanciando, ma dovresti usare round, floor o una funzione simile. Tuttavia usando round si attiverà comunque l'avviso, ma come visto sopra a typecasting una costante o una variabile assegnata no.

Quindi, se è così male per lanciare da double a int, allora perché non lo fa il trigger di avviso quando si scrive o (int)d(int)M_PI? In che modo si dovrebbe aggirare l'avviso nel caso in cui si desideri convertire il valore di ritorno? C'è un avvertimento che gestirà queste pericolose conversioni in un modo più corretto/ragionevole?

risposta

4

-Wbad-function-cast (C e solo Objective-C)

Avvisa quando una chiamata di funzione viene colata a un tipo non corrispondente. Ad esempio, avvertire se una chiamata a una funzione che restituisce un tipo intero viene trasmessa a un tipo di puntatore.

Come suggerisce il nome, -Wbad-function-cast avverte solo quando si sta casting chiamate di funzione ad un tipo non corrispondente. Non avvisa su tutti i cast. Questo spiega il motivo per cui non si è trovato che l'avvertimento per gli ultimi due esempi:

Hai ragione che potrebbe essere un male per lanciare da double a int come si sta potenzialmente perdere informazioni. È possibile evitare l'avviso GCC semplicemente assegnando il valore restituito della funzione a un tipo corrispondente, quindi eseguendo il casting in un secondo momento, come nei due esempi che non attivano l'avviso.

Ovviamente, il punto dell'avviso non è costringerti a scrivere codice aggiuntivo per fare la stessa cosa. Anche per le funzioni che "restituiscono un valore integrale" come round(), the return value may be too big to fit in an int. Quello che dovresti fare è controllare per vedere se il valore è sicuro da trasmettere per primo.