2010-11-10 6 views
7

Ricordo di aver letto prima il significato (o la sua mancanza) tra l'inclusione di un nome parametro in una dichiarazione di funzione e non l'inclusione di uno. Ma non riesco a ricordare cosa ho letto o dove l'ho letto.Qual è la differenza tra includere un nome parametro in una dichiarazione di funzione e non includerne uno?

per esempio,

void do_something(int *); // No parameter name included, only type. 

vs ...

void do_something(int * i); // type AND parameter name included. 

Allora, qual è la differenza tra queste due dichiarazioni? Grazie per la lettura e forse per rispondere a questa domanda forse banale.

- AGGIORNAMENTO -

Okay, quindi la cosa che avevo letto era un insieme di linee guida di stile da un vecchio professore mio avvertimento contro tra cui un nome parametro nella definizione di funzione e non utilizzando il parametro nella funzione .

void do_something(int * i) { //code that doesn't use i;} //BAD 
void do_something(int *) { //code that doesn't use i;} //OK 

risposta

12

Non ci sono differenze, per quanto riguarda il compilatore.

Aggiunta nomi dei parametri significativi è una forma utile di documentazione, però.

1

La differenza è che la seconda versione potrebbe essere più leggibile se si sceglie un buon nome del parametro. Niente altro da dire ;-)

0

In una dichiarazione anticipata, non ci dovrebbe essere alcuna differenza. Entrambi descriveranno lo stesso layout di memoria per la chiamata, quindi dovrebbero essere completamente intercambiabili.

1

Non v'è alcuna differenza tecnica tra tali dichiarazioni. Se invece avessi

void accumulate_stats(int * count); 

o qualcosa di simile descrittiva, sarebbe un miglioramento di auto-documentazione.

0

Per una dichiarazione anticipata, non fa alcuna differenza.

Nella definizione attuale, un parametro senza nome non è selezionata per l'uso. È un modo per avere parametri inutilizzati senza alcuna macro UNUSED_PARAM (x) o qualche altro trucco il cui unico scopo è quello di chiudere il compilatore su di esso.

+0

I macro sono una specie di male, quello con collisioni di nomi, più valutazioni di argomenti, ecc. Talvolta sono praticamente necessari, ma è una buona idea evitarli in generale. Quindi, usa meglio il template della funzione 'unusedParam'. Cioè, se non puoi vivere con gli avvertimenti. Saluti, –

+0

D'accordo, i macros sono cattivi. Ma IMO, qualsiasi codice che esiste solo per dire "sì, non sto facendo nulla con questo argomento. Stai zitto, stupido compilatore!" non è molto meglio – cHao

+0

Ecco perché esiste la sintassi '(void) argName;'. Questo dice al compilatore che "argName" è "usato", sebbene valuti come no-op. –