Zoeken…


Opmerkingen

Bron: Wat is het verschil tussen een definitie en een verklaring?

Bron (voor zwakke en sterke symbolen): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

Verklaring en definitie begrijpen

Een verklaring introduceert een ID en beschrijft het type, of het nu een type, object of functie is. Een verklaring is wat de compiler nodig heeft om verwijzingen naar die identificator te accepteren. Dit zijn verklaringen:

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                         */

Een definitie instantieert / implementeert deze identificatie eigenlijk. Het is wat de linker nodig heeft om verwijzingen naar die entiteiten te koppelen. Dit zijn definities die overeenkomen met de bovenstaande verklaringen:

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) */

Een definitie kan worden gebruikt in plaats van een aangifte.

Het moet echter precies één keer worden gedefinieerd. Als u vergeet iets te definiëren dat ergens is aangegeven en waarnaar wordt verwezen, weet de linker niet waarnaar verwijzingen moeten worden gekoppeld en klaagt over ontbrekende symbolen. Als u iets meer dan eens definieert, weet de linker niet aan welke van de definities verwijzingen moeten worden gekoppeld en klaagt over dubbele symbolen.

Uitzondering:

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

Deze uitzondering kan worden verklaard met behulp van concepten van "sterke symbolen versus zwakke symbolen" (vanuit het perspectief van een linker). Kijk hier (dia 22) voor meer uitleg.

/* 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow