Что значит объявить что-то в C и C++
Когда вы объявляете переменную, функцию или даже класс, все, что вы делаете, это говорите: есть что-то с этим именем и оно имеет этот тип. Затем компилятор может обрабатывать большинство (но не все) вариантов использования этого имени, не требуя полного определения этого имени. Объявление значения без его определения позволяет вам писать код, понятный компилятору, без необходимости вводить все детали. Это особенно полезно, если вы работаете с несколькими исходными файлами и вам нужно использовать функцию в нескольких файлах. Вы не хотите помещать тело функции в несколько файлов, но вам необходимо предоставить для него объявление.
Так как же выглядит декларация? Например, если вы пишете:
int func();
Это объявление функции; он не предоставляет тело функции, но сообщает компилятору, что он может использовать эту функцию и ожидать, что она будет где-то определена.
Что означает определение чего-либо в C и C++
Определение чего-либо означает предоставление всей необходимой информации для создания этого объекта во всей его полноте. Определение функции означает предоставление тела функции; определение класса означает предоставление всех методов класса и полей. Как только что-то определено, это также считается его объявлением; поэтому вы часто можете объявить и определить функцию, класс или переменную одновременно. Но вам не нужно.
Например, наличие объявления часто достаточно для компилятора. Вы можете написать такой код:
int func();
int main()
{
int x = func();
}
int func()
{
return 2;
}
Поскольку компилятор знает возвращаемое значение func и количество аргументов, которые он принимает, он может скомпилировать вызов func, даже если у него еще нет определения. На самом деле определение метода func могло находиться в другом файле!
Вы также можете объявить класс, не определяя его.
класс МойКласс
Код, который должен знать подробности того, что находится в MyClass, не может работать — вы не можете сделать это:
class MyClass;
MyClass an_object;
class MyClass
{
int _a_field;
};
Поскольку компилятору необходимо знать размер переменной an_object, а он не может этого сделать из объявления MyClass; ему нужно определение, которое показано ниже.
person
Walter
schedule
10.10.2014