Recherche…


Remarques

Source: Quelle est la différence entre une définition et une déclaration?

Source (Pour les symboles faibles et forts): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

Comprendre la déclaration et la définition

Une déclaration introduit un identifiant et décrit son type, que ce soit un type, un objet ou une fonction. Une déclaration est ce que le compilateur doit accepter des références à cet identifiant. Ce sont des déclarations:

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

Une définition instancie / implémente cet identifiant. C'est ce que l'éditeur de liens a besoin pour relier les références à ces entités. Ce sont des définitions correspondant aux déclarations ci-dessus:

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

Une définition peut être utilisée à la place d'une déclaration.

Cependant, il doit être défini exactement une fois. Si vous oubliez de définir quelque chose qui a été déclaré et référencé quelque part, alors l'éditeur de liens ne sait pas à quoi lier les références et se plaint des symboles manquants. Si vous définissez quelque chose plus d'une fois, l'éditeur de liens ne sait pas laquelle des définitions pour lier les références à des symboles dupliqués.

Exception:

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

Cette exception peut être expliquée en utilisant les concepts de "symboles forts vs symboles faibles" (du point de vue d'un éditeur de liens). Veuillez regarder ici (diapositive 22) pour plus d'explications.

/* 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow