В C ++ вам нужно понимать разницу между объявлениями функций и определениями функций.
Объявление гласит: "функция с именем somename существует, и это ееinterface ".
extern int somename(int x, int y);
Определение гласит" функция с именем somename существует, и именно так она реализована ".
int somename(int x, int y)
{
return x + y + 1;
}
Заголовок обычно используется для указания интерфейса, предоставляемого одним или несколькими классами, или интерфейса, предоставляемого одной или несколькими функциями.Он может предоставлять другую информацию, которую должны знать пользователи кода.Заголовок предназначен для использования более чем одним исходным файлом;нет особого смысла в том, чтобы иметь заголовок, предназначенный для использования одним исходным файлом (хотя в некоторых случаях это имеет смысл).
Таким образом, обычно заголовок предоставляет объявления функций.
Чтобы усложнить ситуацию, функции могут быть определены встроенными.Когда функция определена как встроенная, вы помещаете ее реализацию в файл (часто это файл заголовка), и компилятор может оптимизировать использование функции, чтобы избежать накладных расходов при вызове функции.Таким образом, вы можете создать заголовок, содержащий:
inline somename(int x, int y) { return x + y + 1; }
Без ключевого слова inline
это приведет к нарушению правила ODR - One Definition Rule.В ODR говорится, что функция или глобально видимый объект могут быть определены в программе только один раз.Если ключевое слово inline
было опущено в заголовке, но заголовок использовался больше, чем в файле, тогда каждый файл определял бы somename()
, и файлы не могли быть связаны друг с другом, потому что было бы несколько определений somename()
.