gpt4 book ai didi

c++ - 在 .h 文件与 .cpp 文件中实现内联函数

转载 作者:太空狗 更新时间:2023-10-29 19:53:21 26 4
gpt4 key购买 nike

这之间的实际区别是什么

//Foo.h
struct Foo {
void bar() {
//lots of complex statements
}
};

还有这个

//Foo.h
struct Foo {
void bar();
};
//Foo.cpp
inline void Foo::bar() {
//lots of complex statements
}

在最终编译的程序中,这两种方法有什么不同还是保证相同?

还请根据良好的编码实践/经验就应该选择哪一个以及为什么进行评论发表一些评论。注意“很多复杂的陈述”。这些东西实际上应该在头文件中的任何特定情况? AFAIK,大多数 boost 库都是仅 header - 他们为什么选择这样做?

最佳答案

Are there any differences whatever in these two approaches in the final compiled program or is it guaranteed to be the same?

两者是一样的。
在类/结构体内定义的成员函数是隐式内联
然而,在第一个示例中,该函数可以在每个包含此 header 的翻译单元中被内联d。在第二个示例中,函数只能内联在定义函数的 cpp 文件中。这是因为编译器需要在函数调用点查看函数的定义,以尝试使其内联。

回答评论中的问题:

假设您在 cpp 文件 A.cpp 中保留标记为 inline 的函数定义,并尝试从另一个 cpp 文件 B 调用此函数.cpp。您最终会得到一个“未定义的外部符号” 错误,这是因为在 C 和 C++ 中每个 translation unit单独编译,在编译B.cpp时,位于A.cpp中的函数定义不可用。
如果该函数仅从定义它的 A.cpp 调用,则该定义在同一文件中可用,并且编译器和链接器很乐意编译并链接到它。

C++03 7.1.2 函数说明符:
第 3 段:

A function defined within a class definition is an inline function. The inline specifier shall not appear on a block scope function declaration.


Which one should choose and why in terms of good coding practices/experience?

类定义是作为类用户的接口(interface)。该接口(interface)的使用者不需要看到函数的实现细节。他们只需要看到如何使用这个接口(interface)。通过将函数定义(你提到的很长)放在类中,你向用户提供了不必要的细节,从而使他们难以理解看到他们真正需要看到的东西。
解决此问题的最佳方法是:

  • 在没有 inline 关键字的类定义中声明函数 &
  • 将带有关键字inline 的函数定义放在类主体之外。

好读:
With inline member functions that are defined outside the class, is it best to put the inline keyword next to the declaration within the class body, next to the definition outside the class body, or both?


AFAIK, most of the boost libs are header-only - why did they do choose to do that?

大多数 Boost 库都是模板库,对于基于模板的库,编译器需要在使用时查看定义,因此模板函数需要内联。
好读:
Why can templates only be implemented in the header file?

关于c++ - 在 .h 文件与 .cpp 文件中实现内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com