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

发布于 2024-10-17 22:16:08 字数 349 浏览 6 评论 0原文

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

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

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

为了实现这一点——在 .h 文件中定义全局函数。

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

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

有人可以帮忙吗?

Sometimes I define bodies of small global functions in .h files (static inline). It works.

Now I have larger global function. I need to to define it in .h file. I do not want it to be static inline. I tried the following trick with "dummy template":

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

to achieve this -- to define global function in .h file.

Compiler complains "cannot deduce template argument for 'unused'".

Do you guys understand what I an trying to do ? How can I trick the compiler ? I think I need to unsert some dummy usage of template arg into the function so that compiler can deduce it.

Can anyone help ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我偏爱纯白色 2024-10-24 22:16:08

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

在 .h 文件中:

int myFunc( int x );

在 .c 文件中:

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

Just put its prototype in the .h file, and its implementation in a single .c file:

In .h file:

int myFunc( int x );

In .c file:

int myFunc( int x )
{
    return x + 4;
}
[浮城] 2024-10-24 22:16:08

您不应该仅仅在函数上使用“static”,以便可以在标头中定义它们,而应使用“inline”。

一旦使用“内联”,就不需要任何模板“技巧”,只需定义函数即可:

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

当您想要将定义移出标头时,删除内联并在 .cpp 文件中定义函数。

You should not use "static" on functions merely so you can define them in a header, use "inline" for that.

And once you use "inline", you don't need any template "tricks", just define the function:

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

When you want to move the definition out of the header, remove the inline and define the function in a .cpp file.

云淡风轻 2024-10-24 22:16:08

老实说,我不建议放置大型非模板函数的定义
在 .h 文件中,除非有明确的原因不能放置定义
在.cpp 文件中。
如果您必须将定义放入 .h 中,以下代码可能会有所帮助:

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

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

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

如果您可以说明必须将定义放入 .h 中的原因,
可能会发布更好的建议。

编辑:
根据 Bo Persson 的指出重写了代码。

Honestly, I don't recommend putting large non-template function's definition
in .h file unless there is definite reason that you can't put the definition
in .cpp file.
If you have to put the definition in .h, the following code might help:

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

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

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

If you could show the reason that you have to put the definition in .h,
better suggestions may be posted.

Edit:
Rewrote the code in the light of Bo Persson's pointing out.

鯉魚旗 2024-10-24 22:16:08

如果您真的想要这样做并且对内联感到偏执。您可以执行以下操作:

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

然后只需在 #include "myheader.h" 行(在 cpp 文件中)其中行之前 #define DEFINE_MY_FUNCTION 即可。

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

If you really want to do this and are paranoid about inlining. You could do the following:

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

Then just #define DEFINE_MY_FUNCTION before one of your #include "myheader.h" lines (in a cpp file).

However, there are many reasons to go the conventional route, as others have advised, not least the fact that any implementation tweaks will require recompilation of any file that uses myfunction().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文