Вы путаете две вещи:
- В объявлении указывается ( объявляет ), что * тип, имя и область действия объекта
- Определение определяет , что такое содержимое объекта
* объект как в: переменная, функция и т. д., а не объект ООП.
Следовательно, определение очень часто является также объявлением,так как вы не можете определить, что находится в объекте, если вы не указали тип объекта.Проще всего запомнить: «Каждое определение является объявлением, но не каждое объявление является определением»
Для переменных
Существует только 1 способ объявления без определенияпеременная:
extern typeX variable_name
Это говорит компилятору, что существует переменная с именем variable_name с типом typeX, но не где ее получить.Любой другой способ объявления переменной также является определением, поскольку он сообщает компилятору зарезервировать для нее место и, возможно, присвоить ей начальное значение.
Разница в структурах и функциях намного более очевидна:
Для структур
Объявление:
struct some_struct{
int a;
int b;
}
Это объявляет some_struct для компилятора с a и b как структурные переменные и с типом int.
Только когда вы определяете их, пространство зарезервировано, и вы можете использовать их:
void foo(){
struct some_struct s;
s.a = 1; // For this to work s needs to be defined
}
Для функций :
Разница гораздо более очевидна
объявление:
// This tells the compiler that there is a function called "foo" that returns void and takes void arguments
void foo();
Определение может быть таким же, как указано выше (в части struct)