2010-11-03 11 views
11

Vado attraverso qualche codice sorgente in C e ho notato quanto segue:uso Strano di vuoto

void some_func (char *foo, struct bar *baz) 
{ 
    (void)foo; 
    (void)baz; 
} 

Perché void utilizzato qui? Conosco (void) prima che un'espressione indichi esplicitamente che il valore è buttato via; ma qualcuno può spiegarmi la logica per un tale uso?

risposta

22

Questo codice garantisce che non verrà visualizzato un avviso del compilatore su foo e baz inutilizzati.

+0

Anche se potevano essere lasciati come promemoria 'TODO'. – ruslik

+1

Potrebbe non essere il caso di qualcosa lasciato TODO: questo potrebbe essere lo stato finale del codice. Ad esempio, questa funzione potrebbe essere una richiamata e quei parametri non vengono realmente utilizzati. –

+1

"Assicurarsi" è un po 'troppo forte. Funzionerà per alcuni compilatori, ma a quanto pare non è universale: http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/ – jamesdlin

8

È probabile che qualcuno stia creando questo codice con un compilatore che emette avvisi per argomenti non utilizzati e desidera eliminare gli avvisi.

6

Il motivo più probabile per cui tali variabili compaiono nella funzione è la rimozione di eventuali avvisi relativi agli argomenti non utilizzati.

Tuttavia, poiché è probabile che questo introduca ancora un altro avviso (poiché si sta probabilmente utilizzando un livello di avviso superiore al normale), l'autore fa un ulteriore passaggio per rimuovere anche quelli.

In C, la dichiarazione

42; 

è in realtà valida, anche se non molto utile. Se si compila:

int main (void) { 
    42; 
    return 0; 
} 

non si lamenterà (normalmente). Tuttavia, se si compila che con gcc -Wall -pedantic (per esempio), si otterrà qualcosa del tipo:

prog.c: In function `main': 
prog.c:2: warning: statement with no effect 

perché il compilatore, giustamente, pensa che tu sei andato pazzo.

Inserire un numero (void) prima di qualcosa che genera un valore, ad esempio lo 42; indicherà esplicitamente che non ti interessa il valore.

Ho visto questo usato su alcuni compilatori anali a ritenzione, che insistono sul fatto che, a causa di una funzione come printf in realtà restituisce un valore, è necessario essere pazzi per ignorarlo, che porta a tali atrocità come:

(void)printf ("Hello, world.\n"); 
(void)strcpy (dest, src); 

:-)


a titolo di esempio, se si compila:

void some_func (char *foo) {} 
int main (void) { some_func (0); return 0; } 

con gcc -Wall -W -pedantic, si otterrà:

warning: unused parameter `foo' 

Se si "usa" il parametro:

void some_func (char *foo) { foo; } 

si otterrà

warning: statement with no effect 

Tuttavia, se si utilizza il parametro e ignorare esplicitamente il risultato:

void some_func (char *foo) { (void)foo; } 

non riceverai alcun avviso.

+0

Sono a conoscenza di questo uso (chiamando una funzione che restituisce qualcosa e si attacca un '(void)' di fronte ad esso per ignorare il valore restituito); Ero semplicemente curioso di sapere perché si farebbe questo a un argomento. – sanjoyd

+0

@theDigtialEngel, vedere l'aggiornamento. Il semplice menzionare il parametro nella funzione sostituisce un avvertimento con un altro. Devi annullare il cast per sbarazzarti di quel secondo avvertimento. – paxdiablo

+0

In effetti puoi andare ancora oltre e rilasciare il nome del parametro: 'void some_func (char *) {}' Presente da http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler- warnings /, che è stato postato in un commento di jamesdlin. Trasformalo in 'template void ignore (T const &) {}' e hai un buon ignoratore generico! :) –