Suche…


Bemerkungen

Quelle: Was ist der Unterschied zwischen einer Definition und einer Deklaration?

Quelle (für schwache und starke Symbole): https://www.amazon.com/Computer-Systems-Programmierer-Perspektive-2nd/dp/0136108040/

Erklärung und Definition verstehen

Eine Deklaration führt einen Bezeichner ein und beschreibt seinen Typ, sei es Typ, Objekt oder Funktion. Eine Deklaration ist das, was der Compiler benötigt, um Verweise auf diesen Bezeichner zu akzeptieren. Dies sind Deklarationen:

extern int bar;
extern int g(int, int);
double f(int, double); /* extern can be omitted for function declarations */
double h1();           /* declaration without prototype */
double h2();           /* ditto                         */

Eine Definition instantiiert / implementiert diese Kennung. Es ist das, was der Linker benötigt, um Verweise auf diese Entitäten zu verlinken. Dies sind Definitionen, die den obigen Deklarationen entsprechen:

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
double h1(int a, int b) {return -1.5;}
double h2() {}  /* prototype is implied in definition, same as double h2(void) */

Anstelle einer Deklaration kann eine Definition verwendet werden.

Es muss jedoch genau einmal definiert werden. Wenn Sie vergessen, etwas zu definieren, das irgendwo deklariert und referenziert wurde, weiß der Linker nicht, worauf er Bezug nehmen soll, und er beschwert sich über fehlende Symbole. Wenn Sie etwas mehr als einmal definieren, kann der Linker nicht wissen, auf welche Definitionen Verweise verweist und sich über duplizierte Symbole beschwert.

Ausnahme:

extern int i = 0;  /* defines i */
extern int j;  /* declares j */

Diese Ausnahme kann mit Konzepten von "Starken Symbolen vs. Schwachen Symbolen" (aus Linkersicht) erklärt werden. Weitere Informationen finden Sie hier (Bild 22).

/* All are definitions. */
struct S { int a; int b; };             /* defines S */
struct X {                              /* defines X */
    int x;                              /* defines non-static data member x */
};
struct X anX;                                  /* defines anX */


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow