Qt Creator: «встроенная функция используется, но не определена» — почему?

Почему я получаю это предупреждение в Qt Creator: ` встроенная функция 'bool Lion::growl()' используется, но не определена?

Я перепроверил свой код и получил декларацию

inline bool growl () in Lion (lion.h)

и соответствующая реализация в lion.cpp:

inline bool Lion::growl ()

Что происходит?

РЕДАКТИРОВАТЬ: Мое предположение заключалось в том, что законно определять фактический встроенный метод в файле .cpp (ключевое слово inline предупреждает компилятор о необходимости искать тело метода в другом месте), или я ошибаюсь?

Я не хочу загромождать файлы заголовков деталями реализации.


person Tony the Pony    schedule 14.09.2009    source источник
comment
примечание: что я узнал, встроенные функции реализованы в файле заголовка (или в отдельном файле inl, который включается в нижней части заголовка).   -  person RvdK    schedule 14.09.2009


Ответы (3)


Ну, я не знаю точную проблему, но для начала:

  • Встроенные методы должны быть реализованы в заголовочном файле. Компилятору нужно знать код, чтобы фактически встроить его.
  • Также использование ключевого слова «inline» в объявлении класса не имеет никакого эффекта. Но и это не может повредить.

См. также: часто задаваемые вопросы по c++ lite

person Johan    schedule 14.09.2009
comment
Лично я (и это дело вкуса) ненавижу код, который явно помечает код как встроенный — либо с помощью ключевого слова inline, либо помещая реализацию в заголовочный файл по 2 причинам: 1) это нарушает инкапсуляцию. 2) это вредит производительности - да, вы меня слышали. Как вы думаете, кто лучше знает, приведет ли встраивание матода к приросту производительности: компилятор или программист. Серьезно, люди, доверяйте своим оптимизаторам, они работают лучше (во многих случаях, но не во всех), чем вы. - person Thomi; 16.09.2009
comment
@ThomiThomi, если я просто создаю 1-строчную оболочку вокруг функции, я уверен, что лучше ее встроить. - person o0'.; 10.03.2012
comment
Microsoft заявляет, что они могут добиться значительного увеличения производительности, времени ссылки и уменьшения размера статических библиотек, применяя это правило: blogs.msdn.com/b/vcblog/archive/2014/09/26 / - person bames53; 09.10.2014

Встроенные методы должны быть реализованы в заголовочном файле. Компилятору нужно знать код, чтобы встроить его.

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

Мне не хватает такого ограничения для библиотек, потому что ограничение заголовков прототипами функций делает вещи более читабельными.

Как насчет #include включения .cpp ?

person Laurent Alebarde    schedule 29.02.2012
comment
C++ требует, чтобы встроенная функция была определена в каждой единице перевода, в которой она используется odr. n3337 basic.def.odr/3 По существу это означает, что когда встроенная функция объявляется в заголовке, она также должна быть определена в заголовке. - person bames53; 09.10.2014

В дополнение к тому, что сказал Йохан, у вас не может быть отдельного определения и объявления для функции, даже если они находятся в одном заголовочном файле. Это верно, особенно для функций-членов классов. Код функции должен иметь вид:

class someClass
{
void someFunc()
{ ... }
}
// This will make the function inline even w/o the explicit 'inline'

И НЕ формы

class someClass
{
public:
     void someFunc();
}

void someClass::someFunc()
{ ... }
person 147    schedule 28.09.2009
comment
На самом деле у вас может быть отдельное определение и объявление: class C { inline void f(); }; void C::f() {}. Вам просто нужно использовать явное inline, а не неявное. - person bames53; 09.10.2014