Функция, имеющая версию релиза, встроенную в файл h, и версию отладки, реализованную на cpp - PullRequest
0 голосов
/ 29 мая 2018

Я поддерживаю унаследованное приложение MFC и вижу шаблон, точно такой же, как в Объектно-ориентированное программирование в Windows книга, где соответствующая часть:

Перспектива.h

#ifndef _DEBUG  // debug version in persview.cpp
inline CPersDoc* CPersView::GetDocument()
   { return (CPersDoc*)m_pDocument; }
#endif

Persview.cpp

#ifdef _DEBUG
CPersDoc* CPersView::GetDocument() // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPersView)));
    return (CPersView*)m_pDocument;
}
#endif //_DEBUG

Я вижу шаблон широко применяемым, если я ищу его в Интернете, поэтому я предполагаю егоэто сгенерированный мастером код.

Мой вопрос: есть ли какое-либо преимущество или другая веская причина для включения версии выпуска в файл .h и отладки в файл .cpp?Почему бы не поместить оба файла в один файл рядом друг с другом?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Обратите внимание, что книга, которую вы цитируете, была опубликована в 1994 году. C ++ тогда сильно отличался, а компилятор Microsoft C ++ - нет.По предположению, inline тогда имел различную семантику и дал указание компилятору встроить вызов функции даже в отладочных конфигурациях.

При этом существуют технические причины: компилятор может тольковстроить функцию, если она видит полное определение.Если вы хотите, чтобы он был встроен в другой модуль компиляции, определение функции должно быть в заголовочном файле.С другой стороны, вы не можете поместить не встроенную функцию в заголовок, потому что это нарушит правило одного определения, если заголовок будет включен в несколько модулей компиляции.В этом случае вы получите ошибки компоновщика.

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

0 голосов
/ 29 мая 2018

Для не отладочной сборки преимущество заключается в том, что заголовочный файл находится именно там, где inline определение функции принадлежит , так что несколько #include видят только одно его определение.

Для отладочной сборки, в которой функция не встроена, преимущество состоит в том, что вы придерживаетесь соглашения о объявлениях и определениях отдельно - определение - это то место, где вы ожидаете его найти.

Т.е. вы бы не поместили их вместе в заголовочный файл, потому что это неожиданно, если не inline, и вы бы не сложили их вместе в исходном файле, потому что это было бы неправильно, если оно inline.

...