Ricerca…


Osservazioni

Fonte: qual è la differenza tra una definizione e una dichiarazione?

Sorgente (per simboli deboli e forti): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

Capire Dichiarazione e Definizione

Una dichiarazione introduce un identificatore e ne descrive il tipo, sia esso un tipo, un oggetto o una funzione. Una dichiarazione è ciò che il compilatore deve accettare i riferimenti a quell'identificatore. Queste sono dichiarazioni:

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

Una definizione effettivamente istanzia / implementa questo identificatore. È ciò di cui il linker ha bisogno per collegare riferimenti a tali entità. Queste sono definizioni corrispondenti alle dichiarazioni di cui sopra:

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

Una definizione può essere utilizzata al posto di una dichiarazione.

Tuttavia, deve essere definito esattamente una volta. Se ti dimentichi di definire qualcosa che è stato dichiarato e referenziato da qualche parte, allora il linker non sa a cosa collegare i riferimenti e si lamenta di un simbolo mancante. Se si definisce qualcosa più di una volta, il linker non sa quale delle definizioni per collegare i riferimenti e si lamenta dei simboli duplicati.

Eccezione:

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

Questa eccezione può essere spiegata usando i concetti di "Simboli forti vs simboli deboli" (dal punto di vista di un linker). Per favore guarda qui (Diapositiva 22) per ulteriori spiegazioni.

/* 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow