2013-01-31 36 views
8

Qualche esempio mi imbatto in un programma che si occupa di menu ..Perché ri-dichiarare una funzione in main?

Ha dichiarato tutte le funzioni prima della funzione principale come capisco dovrebbe essere, e quindi una delle funzioni che è una funzione di void è stata menzionata anche all'interno le principali:

char get_choice(void); 
char get_first(void); 
int get_int(void); 
void count(void); 
int main(void) 
{ 
    int choice; 
    void count(void); 
    while ((choice = get_choice()) != 'q') 
    { 
     switch (choice) 
     { 
      case 'a' : printf("Buy low, sell high.\n"); 
       break; 
      case 'b' : putchar('\a'); /* ANSI */ 
       break; 
      case 'c' : count(); 
       break; 
      default : printf("Program error!\n"); 
       break; 
     } 
    } 
    printf("Bye.\n"); 

... (funzioni implementazioni)

può cortesemente dirmi perché è così? tnx

+0

grazie per la modifica @djechlin – MNY

risposta

4

Questi sono solo la dichiarazione delle funzioni non definitions.Not troppo sicuro perché contano funzione è dichiarata due volte though.The dichiarazione è solo dicendo al compilatore che c'è qualcosa lì con questo name.Perhaps il programmatore ha dimenticato di definire il metodo ?

Una dichiarazione fornisce gli attributi di base di un simbolo: il suo tipo e il suo nome. Una definizione fornisce tutti i dettagli di quel simbolo - se è una funzione, che cosa fa; se è una classe, quali campi e metodi ha; se è una variabile, dove è memorizzata quella variabile.

ad esempio dichiarazione simile a questa:

void count(void); 

ad esempio definizione assomiglia a questo:

void count(void){ 

...... 

} 
6

Nessun motivo, questa è solo una inutile ripetizione del prototipo.

+0

Grazie allot @unwind – MNY

3

Non importa - ha senso per il tuo programma. Ovviamente, se è all'interno del main, allora nessuna altra funzione prima che l'effettiva implementazione della funzione "sappia" cosa sia il prototipo della funzione, il che può avere un impatto.

Personalmente tendo ad implementare la funzione prima che venga chiamata, in questo modo evitando il problema di dove mettere il prototipo [a meno che non entri in un file di intestazione, nel qual caso tende a risolvere il problema].

+0

grazie a un mucchio @ MatsPetersson – MNY

1

Può cortesemente dirmi perché? TNX

Non v'è alcun motivo per cui al di là di esso che è un semplice errore; l'autore ha semplicemente mancato la dichiarazione ridondante. Fintanto che entrambe le dichiarazioni sono uguali, non è un problema (anche se è brutto e dovrebbe essere ripulito).

FWIW, questo è il motivo per cui ho sempre definire le funzioni prima che vengano utilizzate nello stesso file. La definizione conta come una dichiarazione, quindi c'è solo un prototipo di cui preoccuparsi.

Problemi correlati