Обратите внимание, что книга, которую вы цитируете, была опубликована в 1994 году. C ++ тогда сильно отличался, а компилятор Microsoft C ++ - нет.По предположению, inline
тогда имел различную семантику и дал указание компилятору встроить вызов функции даже в отладочных конфигурациях.
При этом существуют технические причины: компилятор может тольковстроить функцию, если она видит полное определение.Если вы хотите, чтобы он был встроен в другой модуль компиляции, определение функции должно быть в заголовочном файле.С другой стороны, вы не можете поместить не встроенную функцию в заголовок, потому что это нарушит правило одного определения, если заголовок будет включен в несколько модулей компиляции.В этом случае вы получите ошибки компоновщика.
Если вы хотите избавиться от дублирования кода и при этом получить те же преимущества, вы можете: Просто переместить версию debug в заголовокотметьте его inline
и удалите условия препроцессора.ASSERT
ничего не компилирует в конфигурации без отладки, и компилятор может (вероятно, будет) встроить вызов функции.Для конфигурации отладки компилятор не выполняет никаких оптимизаций и выдает код для вызова функции.Вызовы функций желательны в конфигурациях отладки, так как они производят более значимые трассировки стека.