2010-06-14 18 views
5

Recentemente mi sono imbattuto in una convenzione di codifica piuttosto insolita in cui la chiamata per una funzione che restituisce "void" è preceduta da (void).È necessario il prefisso di una funzione con (void)

ad es.

(void) MyFunction(); 

E 'diverso dalla chiamata di funzione come:

MyFunction(); 

ha ottenuto alcun vantaggio o è l'ennesimo inutile ma ci codifica convenzione di qualche tipo?

risposta

12

Alcune funzioni come printf() restituiscono un valore che non viene quasi mai utilizzato nel codice reale (nel caso di printf, il numero di caratteri stampati). Tuttavia, alcuni strumenti, come pelucchi, si aspettano che se una funzione restituisce un valore che deve essere utilizzato, e si lamenterà a meno che non si scrive qualcosa di simile:

int n = printf("hello"); 

utilizzando il cast vuoto:

(void) printf("hello"); 

è un modo di dire a tali strumenti che davvero non si vuole usare il valore di ritorno, quindi mantenendoli tranquilli. Se non si utilizzano tali strumenti, non è necessario preoccuparsi e in ogni caso la maggior parte degli strumenti consente di configurarli in modo da ignorare i valori restituiti da funzioni specifiche.

+0

Vedo. Ma allora perché qualcuno dovrebbe voler fare questo per una funzione che già restituisce il nulla? – puffadder

+0

Certo, ma ha detto che il cast è stato creato per funzioni che non restituiscono nulla. – Artefacto

+4

@puffadder A un certo punto, il tipo di ritorno della funzione è stato modificato a un certo punto, ma il codice chiamante non lo ha fatto. –

2

No, non c'è alcuna differenza: ciò che viene trasmesso a vuoto è il valore di ritorno della funzione.

Direi che potrebbe dare un senso a te che vuoi rendere esplicito che non stai usando il valore di ritorno (lo stai chiamando per gli effetti collaterali), ma poiché la funzione ha già un ritorno vuoto, non lo fa ha molto senso

0

Se la funzione restituisce qualcosa, il vuoto potrebbe evitare (!) Un avviso (in effetti non sono stato in grado di far sì che gcc mi avvertisse che il valore di ritorno è stato perso) su alcuni compilatori (o strumenti di sfilacciamento); ma, cosa più importante, chiarisce che un valore di ritorno viene "gettato" di proposito (e non per errore).

0

acedemically: una "funzione" restituisce sempre qualcosa, altrimenti sarebbe una procedura. Quindi l'autore di questo codice vuole dire "so che questo nome è sbagliato, ma non cambierò il nome, quindi renderò visibile questo disturbo"

0

Ha qualche vantaggio o è ancora un altro inutile ma c'è convenzione di codifica di qualche tipo?

Nessuna differenza. È una convenzione abbastanza comune, ad es. nei test del software per evidenziare il fatto che nel contesto il ritorno della funzione, se presente, è sicuro da scartare.

0

Nelle pagine man HPUX è piuttosto comune nel codice di esempio vedere un cast da annullare per aggirare gli avvertimenti sui pelucchi.

fprintf(mystream, "%s\n", "foo"); 

vs.

(void)fprintf(mystream, "%s\n", "foo"); 

che può essere dove l'autore del codice proviene. IMO, questa non è una grande idea perché la maggior parte della famiglia sprintf, per esempio, chiama malloc. malloc fallirà quando non c'è abbastanza memoria.SIGINT causa anche il syscall di write() sottostante per interrompere e non scrivere tutto il buffer, per i membri della famiglia printf().

Problemi correlati