Путаница возникает из-за двух эффектов:
- Он сообщает компилятору, что код функции может быть расширен , где функция вызывается, вместо эффективного вызова .
- Он сообщает компилятору, что определение функции может быть повторено.
Пункт 1. «архаичен» в том смысле, что компилятор может фактически делать то, что ему нравится, для оптимизации кода. Он всегда будет «встроенный» машинный код, если он может и будет удобно это делать, и никогда не сделает этого, если не сможет.
Пункт 2. является фактическим значением термина: если вы define
(задаете тело) функцию в заголовке, поскольку заголовок может быть включен в другие источники, вы должны сообщить компилятору, чтобы он сообщал компоновщику о определение дублируется, чтобы их можно было объединить.
Теперь, согласно спецификации языка, свободные функции (не определенные в телах классов) по умолчанию не определены как встроенные, поэтому в заголовке определяется такая вещь, как
void myfunc()
{}
если заголовок включен в большее количество источников, а затем связан с одним и тем же выводом, компоновщик сообщит об ошибке множественного определения, поэтому необходимо определить его как
inline void fn()
{}
Для учеников по умолчанию все наоборот: если вы просто объявите их, они не будут встроены. Если вы определите их, они будут встроены.
Таким образом, заголовок должен выглядеть как
//header file
class myclass
{
public:
void fn1()
{} //defined into the class, so inlined by default
void fn2();
};
inline void myclass::fn2()
{} //defined outside the class, so explicit inline is needed
И если определение myclass::fn2()
входит в правильный источник, оно должно потерять ключевое слово inline
.