有时我在.h文件中定义小型全局函数的主体(静态内联)。它有效。
现在我有更大的全局功能。我需要在.h文件中定义它。我不希望它是静态内联。我用“虚拟模板”尝试了以下技巧:
template <typename Tunused> int myfunction(...) {
...
}
实现这一目标 - 在.h文件中定义全局函数。
编译器抱怨“无法推断'未使用'的模板参数”。
你们明白我想做什么吗?我怎么欺骗编译器?我想我需要在函数中插入模板arg的一些虚拟用法,以便编译器可以推导出它。
有人可以帮忙吗?
答案 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()
的任何文件。