如何在.h文件中定义函数体?

时间:2011-02-19 08:38:54

标签: c++ templates visual-c++ header-files

有时我在.h文件中定义小型全局函数的主体(静态内联)。它有效。

现在我有更大的全局功能。我需要在.h文件中定义它。我不希望它是静态内联。我用“虚拟模板”尝试了以下技巧:

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

实现这一目标 - 在.h文件中定义全局函数。

编译器抱怨“无法推断'未使用'的模板参数”。

你们明白我想做什么吗?我怎么欺骗编译器?我想我需要在函数中插入模板arg的一些虚拟用法,以便编译器可以推导出它。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

将其原型放在.h文件中,并将其实现放在一个.c文件中:

在.h文件中:

int myFunc( int x );

在.c文件中:

int myFunc( int x )
{
    return x + 4;
}

答案 1 :(得分:2)

你不应该仅仅在函数上使用“static”,这样你就可以在标题中定义它们,使用“inline”。

一旦你使用“内联”,你不需要任何模板“技巧”,只需定义功能:

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

如果要将定义移出标题,请删除内联并在.cpp文件中定义该函数。

答案 2 :(得分:1)

老实说,我不建议使用大型非模板函数的定义 在.h文件中,除非有明确的理由说你不能把这个定义 在.cpp文件中。 如果必须将定义放在.h中,则以下代码可能有所帮助:

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

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

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

如果你能说明你必须把定义放在.h的原因, 可以发布更好的建议。

修改 根据Bo Persson的指示重写了这段代码。

答案 3 :(得分:0)

如果确实想要这样做,并且对于内联是偏执的。您可以执行以下操作:

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

然后在#define DEFINE_MY_FUNCTION行的一个之前#include "myheader.h"(在cpp文件中)。

然而,正如其他人所建议的那样,传统路线有很多理由,尤其是任何实施调整都需要重新编译使用myfunction()的任何文件。