Как определить встроенную свободную функцию (не член-функцию) в C ++? - PullRequest
0 голосов
/ 15 февраля 2019

В C ++ мне нужно определить некоторые встроенные общие функции.Однако, когда я записываю прототип в файл заголовка, а реализацию в файл .cpp, я сталкиваюсь с ошибкой «LNK2001 unresolved external symbol».

Должен ли я удалить файл .cpp и реализовать функцию вфайл заголовка?

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

Файл заголовка:

inline void foo()
{
    //some code
}

.cpp файл

//nothing

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Имя спецификатора inline несколько вводит в заблуждение, так как предполагает, что функция должна быть встроенной.Тем не менее, inline в первую очередь определяет связь функции (это также подсказка компилятору рассмотреть возможность встраивания).Для объявленной функции inline в скомпилированном объекте не генерируется связываемый символ.

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

Если небольшая функция требуется только один раз дляодин модуль компиляции, вам не нужно объявлять его где-либо еще.Более того, вам не нужно объявлять его встроенным, но поместите его в анонимное пространство имен, чтобы оно не было видно (в сгенерированном объектном файле).

Так что, либо (это, скорее всего, ваш вариант использования)

// foo.hpp:
inline void foo(bar x) { /* ... */ }  // full definition

// application.cpp:
#include "header.hpp"

/* ... */ foo();

или

// application.cpp:
namespace {
    inline void foo(bar x)   // inline specifier redundant
    { /* ... */ }
}

/* ... */ foo();
0 голосов
/ 15 февраля 2019

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

...