Если вы поместите MyClass::foo()
в заголовочный файл и не сможете объявить его inline
, то компилятор сгенерирует тело функции для каждого модуля компиляции, который #include
содержит заголовок, и они будут конфликтовать во время компоновки.Обычная ошибка, выдаваемая компоновщиком, - что-то вроде Multiple definition of symbol MyClass::foo()
или что-то подобное.Объявление функции inline
позволяет избежать этого, и компилятор и компоновщик должны быть в сговоре по этому поводу.
Как вы упоминаете в своем комментарии, ключевое слово inline
также действует как подсказка компилятору, который вы бы хотели, чтобы функция была фактически встроенной, потому что (предположительно) вы часто вызываете ее и больше заботитесь о скорости, чем о размере кода.Хотя компилятору не требуется выполнять этот запрос, поэтому он может генерировать одно или несколько тел функций (в разных единицах компиляции), поэтому компоновщик должен знать, что они на самом деле все одинаковы, и что ему нужно только сохранить один изих (любой сделает).Если бы он не знал, что все они одинаковы, он бы не знал, что делать, поэтому «классическим» поведением всегда было появление ошибки.
Учитывая, что компиляторы в наши дни частов любом случае встроенные небольшие функции, большинство компиляторов также имеют какое-то ключевое слово noinline
, но это не является частью стандарта.
Подробнее о inline
в cppreference .