2010-08-26 18 views
5

Sono un po 'confuso sulle regole delle dichiarazioni e delle definizioni.Dichiarazione e definizione diverse in C++

Ho la seguente dichiarazione funcs.h:

void sumTotalEnrgyAndClush(Protein &A,Protein &B,double ans[2],double enrgyA[18][18],double  enrgyB[18][18]); 

noti che ans [2] è prima enrgyA e B.

Nel funcs.cpp il file la definizione inizia così:

void sumTotalEnrgyAndClush(Protein &A,Protein &B,double enrgyA[18][18],double enrgyB[18][18],double ans[2]) 

Compila (tramite makefile) e funziona correttamente.

Ho anche notato che se rimuovo la dichiarazione il compilatore sembra gestirlo bene.

Perché il cambiamento nell'ordine degli argomenti non è importante? È che gli ultimi 3 articoli sono tutti puntatori quindi la differenza nell'ordine non ha importanza?

+0

possibile duplicato di [Qual è la differenza tra una definizione e una dichiarazione?] (Http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a- dichiarazione) – sbi

+2

Non un duplicato; in realtà una domanda interessante. –

+0

Il cambiamento nell'ordine * ha * importanza. EDIT: James McNellis ha detto meglio nella sua risposta. –

risposta

12

Perché il cambiamento nell'ordine degli argomenti non è importante?

L'ordine fa questione. In C++, le funzioni possono essere sovraccaricate, quindi due o più funzioni possono avere lo stesso nome se hanno parametri diversi (o, se sono funzioni membro, se differiscono per la qualifica costante).

In realtà sono state dichiarate due funzioni sumTotalEnrgyAndClush. La dichiarazione nel file di intestazione dichiara una funzione che non viene mai definita e la dichiarazione nel file di origine dichiara e definisce una seconda funzione.

Se si è tentato di utilizzare la funzione dichiarata nel file di intestazione (richiamandola o prendendo l'indirizzo, ad esempio), si otterrebbe un errore perché tale funzione non è definita.

+0

Vorrei poter sopravvivere più volte! – Kangkan

+0

Ciò che originariamente mi confondeva era che il mio programma stava funzionando nonostante quello che hai menzionato nella tua ultima frase. Da allora ho notato che c'era una definizione aggiuntiva nel mio file main.cpp che corrispondeva alla dichiarazione nel file funcs.h. Ma la tua risposta è stata una grande aggiunta alla mia conoscenza generale. Grazie. – Meir

+1

@Dave: se ti attieni a un insieme di regole in cui le definizioni vanno per le cose dichiarate nelle intestazioni (come tutto in 'xh' è definito in' x.cpp'), non avrai più definizioni (diverse) per la stessa cosa Una volta che sei in un vero grande progetto (migliaia di file sorgente), avrai bisogno di questo, o non sarai mai in grado di orientarti. – sbi

Problemi correlati