2010-08-26 13 views
5

Ich bin ein wenig verschwommen auf die Regeln der Deklarationen vs. Definitionen.Andere Deklaration und Definition in C++

Ich habe die folgende Erklärung in funcs.h:

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

Beachten Sie, dass ans [2] ist vor enrgyA und B.

Im funcs.cpp die Definition dieser beginnt wie file:

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

Es kompiliert (über Makefile) und funktioniert gut.

Ich bemerkte auch, dass, wenn ich die Deklaration entferne der Compiler scheint gut zu verwalten.

Warum ist die Änderung in der Reihenfolge der Argumente nicht wichtig? Ist es, dass die letzten 3 Punkte alle Zeiger sind, so dass der Unterschied in der Reihenfolge keine Rolle spielt?

+0

möglich Duplikat von [Was ist der Unterschied zwischen einer Definition und einer Deklaration?] (Http://stackoverflow.com/questions/1410563/what-ist-the-difference-between-a-definition-anda-a- Erklärung) – sbi

+2

Kein Duplikat; eigentlich eine interessante Frage. –

+0

Die Änderung in der Reihenfolge * ist * wichtig. EDIT: James McNellis sagte es besser in seiner Antwort. –

Antwort

12

Warum ist die Änderung in der Reihenfolge der Argumente nicht wichtig?

Die Reihenfolge ist Angelegenheit. In C++ können Funktionen überladen werden, so dass zwei oder mehr Funktionen denselben Namen haben können, wenn sie unterschiedliche Parameter haben (oder, wenn es sich um Elementfunktionen handelt, wenn sie sich in const-qualification unterscheiden).

Sie haben tatsächlich zwei sumTotalEnrgyAndClush Funktionen deklariert. Die Deklaration in der Headerdatei deklariert eine Funktion, die niemals definiert ist, und die Deklaration in der Quellendatei deklariert und definiert eine zweite Funktion.

Wenn Sie versucht haben, die in der Header-Datei deklarierte Funktion zu verwenden (indem Sie sie aufrufen oder ihre Adresse übernehmen), erhalten Sie einen Fehler, weil diese Funktion nicht definiert ist.

+0

Ich wünschte, ich könnte das mehrmals wiederholen! – Kangkan

+0

Was mich ursprünglich verwirrt hat, war, dass mein Programm trotz allem, was Sie in Ihrem letzten Satz erwähnt haben, funktioniert hat. Ich habe seitdem bemerkt, dass es eine zusätzliche Definition in meiner Datei main.cpp gab, die mit der Deklaration in der Datei funcs.h übereinstimmte. Aber Ihre Antwort war eine großartige Ergänzung zu meinem allgemeinen Wissen. Danke. – Meir

+1

@Dave: Wenn Sie sich an eine Reihe von Regeln halten, bei denen die Definitionen für in Kopfzeilen deklarierte Dinge gelten (wie alles in 'xh' in' x.cpp' definiert ist), haben Sie nicht mehrere (unterschiedliche) Definitionen für die gleiche Sache. Sobald Sie in einem wirklich großen Projekt sind (Tausende von Quelldateien), werden Sie das brauchen, oder Sie werden sich niemals zurechtfinden. – sbi

Verwandte Themen