Buscar..


Observaciones

Fuente: ¿Cuál es la diferencia entre una definición y una declaración?

Fuente (para símbolos débiles y fuertes): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

Entendiendo la Declaración y la Definición

Una declaración introduce un identificador y describe su tipo, ya sea un tipo, objeto o función. Una declaración es lo que el compilador necesita para aceptar referencias a ese identificador. Estas son declaraciones:

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 definición en realidad crea una instancia / implementa este identificador. Es lo que necesita el enlazador para vincular las referencias a esas entidades. Estas son definiciones correspondientes a las declaraciones anteriores:

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 definición puede ser usada en lugar de una declaración.

Sin embargo, debe definirse exactamente una vez. Si olvida definir algo que ha sido declarado y referenciado en alguna parte, entonces el enlazador no sabe a qué vincular las referencias y se queja de los símbolos que faltan. Si define algo más de una vez, entonces el enlazador no sabe con cuál de las definiciones vincular las referencias y se queja sobre los símbolos duplicados.

Excepción:

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

Esta excepción se puede explicar utilizando los conceptos de "Símbolos fuertes frente a símbolos débiles" (desde la perspectiva de un enlazador). Por favor mira aquí (Diapositiva 22) para más explicación.

/* 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow