A объявление вводит идентификатор и описывает его тип, будь то тип, объект или функция. Объявление , что нужно компилятору , чтобы принимать ссылки на этот идентификатор. Это декларации:
extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations
A определение фактически создает / реализует этот идентификатор. Это , что нужно компоновщику , чтобы связать ссылки с этими объектами. Это определения, соответствующие вышеуказанным декларациям:
int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};
Определение может использоваться вместо объявления.
Идентификатор может быть объявлен так часто, как вы хотите. Таким образом, в C и C ++ допустимо следующее:
double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);
Однако, оно должно быть определено ровно один раз. Если вы забыли определить что-то, что было объявлено и где-то указано, то компоновщик не знает, на что ссылаются ссылки, и жалуется на отсутствующие символы. Если вы определяете что-то более одного раза, то компоновщик не знает , на который определений ссылаются, и жалуется на дублированные символы.
Поскольку обсуждение того, что такое класс объявление против класса определение в C ++, продолжается (в ответах и комментариях к другим вопросам), я вставлю цитату из стандарт C ++ здесь.
В 3.1 / 2 C ++ 03 говорит:
Объявление является определением, если оно [...] не является объявлением имени класса [...].
3.1 / 3 затем приводит несколько примеров. Среди них:
[Example: [...]
struct S { int a; int b; }; // defines S, S::a, and S::b [...]
struct S; // declares S
—end example
Подводя итог: стандарт C ++ рассматривает struct x;
как объявление и struct x {};
a определение . (Другими словами, «предварительное объявление» - неправильное выражение , поскольку в C ++ нет других форм объявлений классов.)
Спасибо litb (Йоханнес Шауб) , который выкопал настоящую главу и стих в одном из своих ответов.