2011-01-31 10 views
15

Quando si implementano gli stub, si desidera evitare gli avvisi di "variabile non utilizzata". Mi sono imbattuto in alcune alternative di macro UNUSED() nel corso degli anni, ma mai uno che sia provato a funzionare per i compilatori "tutti", o uno che per standard è a tenuta d'aria.Universalmente il modo indipendente per il compilatore di implementare una macro UNUSED in C/C++

Oppure siamo bloccati con blocchi #ifdef per ogni piattaforma di costruzione?

EDIT: A causa di un numero di risposte con alternative non c-compliant, vorrei chiarire che sto cercando una definizione che è valido sia per C e C++, tutti i sapori ecc

+5

Nessuno degli standard dice nulla su quando gli avvertimenti possono o devono essere emessi, quindi non c'è modo per nulla di essere ermetico per gli standard in nessuna delle lingue che stai chiedendo. –

+0

@Steve: In effetti, linea di pensiero maldestra. – sharkin

+0

possibile duplicato di [Will a "variableName;" Dichiarazione C++ essere un no-op in ogni momento?] (Http://stackoverflow.com/questions/4030959/will-a-variablename-c-statement-be-a-no-op-at-all-times) –

risposta

30

Secondo this answer dal user GMan tipico modo è il cast void:

#define UNUSED(x) (void)(x) 

ma se x è contrassegnato come volatile che rispettare lettura dal variabile e quindi hanno un effetto collaterale e quindi il modo vero e proprio per garantire quasi un no-op e sopprimere l'avviso del compilatore è la seguente:

// use expression as sub-expression, 
// then make type of full expression int, discard result 
#define UNUSED(x) (void)(sizeof((x), 0)) 
+4

Suppongo che dovrei fare +1. :) – GManNickG

+2

Hai trovato una risposta molto completa e selezionato la peggiore delle soluzioni suggerite? A proposito, quando esiste già una risposta su SO, è un buon segno che la domanda è duplice. –

+0

@ Ben: Stavo considerando di fare un commento simile, ma per gli scopi e le finalità della macro, penso che questo sia abbastanza canonico. (Ovvero, solo per usare un parametro e non un'espressione.) – GManNickG

1

In C++, basta commentare i nomi.

void MyFunction(int /* name_of_arg1 */, float /* name_of_arg2*/) 
{ 
    ... 
} 
+2

che non è codice C legale ... – Christoph

+4

-1, come semplice C questo non compila nemmeno – sharkin

+2

questa è una soluzione solo per C++. Non ha senso avere un'unica soluzione che funzioni sia per C che per C++; il punto è che questo funziona per tutti i compilatori/piattaforme in C++. Una soluzione C è indipendente. – tenfour

-2

Il modo universale non è di attivare opzioni di avviso che gli avvisi di spam per codice chiaramente corretto. Qualsiasi opzione di avviso "variabile non utilizzata" che include argomenti di funzione nella sua analisi è semplicemente errata e dovrebbe essere lasciata vuota. Non sparpagliate il vostro codice con bruttezza per silenziosi compilatori.

Si potrebbe anche provare a inviare una segnalazione di errore al manutentore/venditore del compilatore.

+0

In realtà sono d'accordo in un certo senso. Tuttavia, anche se esiterei a spostare il problema a mantenere i disablers di avviso, alcuni compilatori non supportano singoli avvisi disabilitati. – sharkin

+0

Finché il compilatore utilizzato per lo sviluppo supporta la disattivazione di singoli avvisi, tutto va bene. Basta disabilitare tutti gli avvisi sui sistemi diversi da quelli di sviluppo, se necessario. Sicuramente il supporto di gcc e MSVC disabilita questo avvertimento ... –

+1

Inoltre, il comportamento desiderato è di solito: "Avverta a meno che non sia stato detto altrimenti". Se la barra del vuoto (int foo), non ha UNUSED (foo), l'avviso NON deve essere rimosso – aiao

Problemi correlati