2011-09-08 29 views
40

Sto leggendo questo codice di esempio da FUSE:Cosa fa (void) "nome variabile" all'inizio di una funzione C?

http://fuse.sourceforge.net/helloworld.html

e sto avendo difficoltà a capire ciò che il seguente frammento di codice fa:

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler, 
         off_t offset, struct fuse_file_info *fi) 
{ 
    (void) offset; 
    (void) fi; 

In particolare, la (void) "nome della variabile "cosa Non ho mai visto questo tipo di costrutto in un programma C prima, quindi non so nemmeno cosa mettere nella casella di ricerca di Google. La mia attuale ipotesi migliore è che sia un qualche tipo di specificatore per i parametri di funzione non utilizzati? Se qualcuno sa cosa sia e potrebbe aiutarmi, sarebbe fantastico. Grazie!

+1

Ha compilazione? –

+0

È venuto qui mentre leggevo il codice del fusibile: D –

risposta

76

Funziona attorno ad alcuni avvisi del compilatore. Alcuni compilatori avviseranno se non si utilizza un parametro di funzione. In tal caso, potresti aver deliberatamente non usato quel parametro, non essere in grado di cambiare l'interfaccia per qualche motivo, ma voler comunque chiudere l'avviso. Il costrutto di lancio (void) è un no-op che fa sparire l'avviso. Ecco un semplice esempio utilizzando clang:

int f1(int a, int b) 
{ 
    (void)b; 
    return a; 
} 

int f2(int a, int b) 
{ 
    return a; 
} 

Costruire con la bandiera -Wunused-parameter e presto:

$ clang -Wunused-parameter -c -o example.o example.c 
example.c:7:19: warning: unused parameter 'b' [-Wunused-parameter] 
int f2(int a, int b) 
       ^
1 warning generated. 
+1

+1 per l'esempio:) – Macmade

+0

Non sarebbe più semantico usare '#define IGNORE_UNUSED (var) (void) (var)' allora? – orlp

+0

@nightcracker, non so cosa significhi "più semantico", ma l'uso dell'OP è un linguaggio abbastanza comune. –

5

Non fa nulla, in termini di codice.

È qui indicare al compilatore che tali variabili (in tal caso i parametri) non sono utilizzate, per evitare gli avvertimenti -Wunused.

Un altro modo per farlo è quello di utilizzare:

#pragma unused