Как определить тело функции в файле .h? - PullRequest
0 голосов
/ 19 февраля 2011

Иногда я определяю тела небольших глобальных функций в файлах .h (статические inline).Это работает.

Теперь у меня есть глобальная функция большего размера.Мне нужно определить это в .h файле.Я не хочу, чтобы он был статическим.Я попробовал следующий трюк с «фиктивным шаблоном»:

template <typename Tunused> int myfunction(...) {
    ...
}

, чтобы добиться этого - определить глобальную функцию в файле .h.

Компилятор жалуется, что «не может вывести аргумент шаблона для« unused »».

Ребята, вы понимаете, что я пытаюсь сделать?Как я могу обмануть компилятор?Я думаю, что мне нужно отключить какое-то фиктивное использование шаблона arg в функции, чтобы компилятор мог вывести его.

Может кто-нибудь помочь?

Ответы [ 4 ]

2 голосов
/ 19 февраля 2011

Вы не должны использовать «static» для функций просто для того, чтобы вы могли определить их в заголовке, для этого используйте «inline».

И как только вы используете «inline», вам не нужно никаких шаблонных «трюков», просто определите функцию:

inline int myfunction(...) {/*...*/}

Если вы хотите переместить определение из заголовка, удалите строку и определите функцию в файле .cpp.

2 голосов
/ 19 февраля 2011

Просто поместите его прототип в файл .h, а его реализацию в один файл .c:

В файле .h:

int myFunc( int x );

В файле .c:

int myFunc( int x )
{
    return x + 4;
}
1 голос
/ 19 февраля 2011

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

// .h
template< int Unused > int myfunction_() {
  // definition
}

namespace { int (&myfunction)() = myfunction_<0>; }

// .cpp
int main() { myfunction(); }

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

Редактировать: Переписал код в свете указания Бо Перссона.

0 голосов
/ 19 февраля 2011

Если вы действительно хотите это сделать и параноидально настроены на встраивание. Вы можете сделать следующее:

#ifdef DEFINE_MY_FUNCTION
int myfunction(...) {
    ...
}
#else
// just declare it
int myfunction(...);
#endif

Затем просто #define DEFINE_MY_FUNCTION перед одной из ваших #include "myheader.h" строк (в файле cpp).

Однако есть много причин, чтобы пойти по обычному пути, как советуют другие, не в последнюю очередь тот факт, что любые настройки реализации потребуют перекомпиляции любого файла, который использует myfunction().

...