Die Bedeutung von beidem entzieht sich mir.
Antworten
Zu viele Anzeigen?Ähnliche Antworten finden Sie hier: Technische Interviewfragen in C .
A Erklärung gibt dem Programm einen Namen; ein Definition bietet eine eindeutige Beschreibung einer Entität (z. B. Typ, Instanz und Funktion) innerhalb des Programms. Deklarationen können in einem bestimmten Bereich wiederholt werden, sie führen einen Namen in einem bestimmten Bereich ein.
Eine Erklärung ist eine Definition, es sei denn:
- Die Deklaration deklariert eine Funktion, ohne ihren Körper zu spezifizieren,
- Die Deklaration enthält einen externen Spezifizierer und keinen Initialisierer oder Funktionskörper,
- Deklaration ist die Deklaration eines statischen Klassendatenelements ohne Klassendefinition,
- Die Deklaration ist eine Definition des Klassennamens,
Eine Definition ist eine Erklärung, es sei denn:
- Die Definition definiert ein statisches Datenelement der Klasse,
- Definition definiert eine Nicht-Inline-Mitgliedsfunktion.
Erklärung sagt: "Dieses Ding existiert irgendwo"
int sampleFunc(); // function
extern int car; // variable
Definition sagt: "Dieses Ding existiert hier; speichere es ab".
int sampleFunc() {} // function
int car; // variable
Initialisierung ist bei der Definition von Objekten fakultativ und besagt: "Hier ist der Anfangswert für diese Sache":
int car = 0; // variable
Um den Unterschied zwischen Deklaration und Definition zu verstehen, müssen wir uns den Assemblercode ansehen:
uint8_t ui8 = 5; | movb $0x5,-0x45(%rbp)
int i = 5; | movl $0x5,-0x3c(%rbp)
uint32_t ui32 = 5; | movl $0x5,-0x38(%rbp)
uint64_t ui64 = 5; | movq $0x5,-0x10(%rbp)
double doub = 5; | movsd 0x328(%rip),%xmm0 # 0x400a20
movsd %xmm0,-0x8(%rbp)
und das ist nur die Definition:
ui8 = 5; | movb $0x5,-0x45(%rbp)
i = 5; | movl $0x5,-0x3c(%rbp)
ui32 = 5; | movl $0x5,-0x38(%rbp)
ui64 = 5; | movq $0x5,-0x10(%rbp)
doub = 5; | movsd 0x328(%rip),%xmm0 # 0x400a20
movsd %xmm0,-0x8(%rbp)
Wie Sie sehen können, hat sich nichts geändert.
Die Deklaration unterscheidet sich von der Definition, da sie Informationen enthält, die nur vom Compiler verwendet werden. Zum Beispiel sagt uint8_t dem Compiler, dass er die ASM-Funktion movb verwenden soll.
Siehe das:
uint def; | no instructions
printf("some stuff..."); | [...] callq 0x400450 <printf@plt>
def=5; | movb $0x5,-0x45(%rbp)
Die Deklaration hat keine gleichwertige Anweisung, weil sie nicht ausgeführt werden kann.
Außerdem teilt die Deklaration dem Compiler den Geltungsbereich der Variablen mit.
Wir können sagen, dass die Deklaration eine Information ist, die vom Compiler verwendet wird, um die korrekte Verwendung der Variablen festzulegen und um zu bestimmen, wie lange ein bestimmter Speicherplatz zu einer bestimmten Variablen gehört.
20 Stimmen
Um ehrlich zu sein, hatte ich große Schwierigkeiten, herauszufinden, wer wer ist, und ich fand die Namen nicht offensichtlich. Ich hatte kein Problem mit den Bedeutungen, sondern nur damit, welche Namen ich mit den Bedeutungen in Verbindung bringen konnte.
2 Stimmen
Wir haben das schon ausführlich besprochen: stackoverflow.com/questions/671925/
7 Stimmen
Dennoch ist es keine doppelte Frage, da diese Frage sich auf C/C++ bezieht, während die andere Frage sich auf alle oder keine Sprachen im Allgemeinen bezieht. Es gibt nur doppelte Antworten (da bei der anderen Frage einige Antworten alle Sprachen außer C und/oder C++ ignorierten).
7 Stimmen
@DavidThornley Ich verwende diesen Trick: a Definition gibt eine feinere Beschreibung einer bestimmten Variablen oder Funktion. Um mich daran zu erinnern, erinnere ich daran, dass die Mitte des Wortes "Definition" eine Ähnlichkeit mit dem Wort "feiner" hat :)
2 Stimmen
@MarcoLeogrande: Oder "definitiv"!
1 Stimmen
Eine viel interessantere Frage ist die nach dem Unterschied zwischen einer Erklärung und einem Prototyp ": stackoverflow.com/questions/5481579/
1 Stimmen
Hier ist ein schöner Artikel, der erklärt, wie das externe Schlüsselwort und die Speicherzuweisung mit Deklarationen / Definitionen zusammenhängt: dreamincode.net/forums/topic/171468-erklärungen-vs-definitionen
1 Stimmen
Das kann helfen cprogramming.com/declare_vs_define.html
0 Stimmen
Wenn Sie Schwierigkeiten haben, sich die Begriffe zu merken, beachten Sie bitte, dass die Begriffe in alphabetischer Reihenfolge stehen - Erklärung, Definition, Verweis. Das ist im Allgemeinen die Reihenfolge, in der sie erscheinen sollten.
0 Stimmen
Mögliches Duplikat von Was genau sind C++-Definitionen, Deklarationen und Zuweisungen?