Поиск…


замечания

Источник: Какая разница между определением и декларацией?

Источник (для слабых и сильных символов): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/

Понимание Декларации и Определение

Объявление вводит идентификатор и описывает его тип, будь то тип, объект или функция. Декларация - это то, что компилятор должен принимать ссылки на этот идентификатор. Это декларации:

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

Определение фактически создает / реализует этот идентификатор. Это то, что требуется компоновщику, чтобы связать ссылки на эти объекты. Это определения, соответствующие приведенным выше объявлениям:

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

Определение может быть использовано в месте объявления.

Однако он должен быть определен ровно один раз. Если вы забыли определить что-то, что было объявлено и где-то указано, то компоновщик не знает, на что ссылаться ссылки и жалуется на недостающие символы. Если вы определяете что-то более одного раза, то компоновщик не знает, какое из определений ссылается на ссылки и жалуется на дублированные символы.

Исключение:

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

Это исключение можно объяснить с помощью понятий «Сильные символы против слабых символов» (с точки зрения компоновщика). Подробнее см. Здесь (Слайд 22).

/* 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow