Sök…


Anmärkningar

Källa: Vad är skillnaden mellan en definition och en deklaration?

Källa (för svaga och starka symboler): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

Förstå förklaring och definition

En deklaration introducerar en identifierare och beskriver dess typ, vare sig det är en typ, objekt eller funktion. En deklaration är vad kompilatorn behöver för att acceptera referenser till den identifieraren. Dessa är deklarationer:

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

En definition instanterar / implementerar faktiskt denna identifierare. Det är vad länken behöver för att länka referenser till dessa enheter. Dessa är definitioner som motsvarar deklarationerna ovan:

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

En definition kan användas i stället för en deklaration.

Men det måste definieras exakt en gång. Om du glömmer att definiera något som har förklarats och hänvisats någonstans, vet inte länken vad de ska länka referenser till och klagar över saknade symboler. Om du definierar något mer än en gång vet inte länken vilken av definitionerna att länka referenser till och klagar över duplicerade symboler.

Undantag:

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

Detta undantag kan förklaras med hjälp av begrepp "Starka symboler mot svaga symboler" (ur en länkars perspektiv). Vänligen titta här (bild 22) för mer förklaring.

/* 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow