在.h文件和.cpp文件中实现内联函数

时间:2013-02-10 12:32:08

标签: c++ boost

这个

之间的实际差异是什么
//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,大多数提升库只是标题 - 他们为什么选择这样做?

2 个答案:

答案 0 :(得分:8)

  

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

两者都相同。
在类/结构体内定义的成员函数隐式inline 但是,在第一个示例中,函数可以在包含此标头的每个转换单元中inline d。在第二个示例中,函数只能在定义函数的cpp文件中内联。这是因为编译器需要在函数调用点看到函数的定义,以尝试使其内联。

在评论中回答问题:

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

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

  

类定义中定义的函数是内联函数。内联说明符不应出现在块作用域函数声明中。


  

在良好的编码实践/经验方面,应该选择哪一个?为什么?

类定义用作类的用户的接口。此接口的用户无需查看功能的实现细节。他们需要知道的是如何使用这个界面。通过在类中放置函数定义(一个很长的,如你提到),你向用户提供了不必要的细节,从而使他们很难看看他们真正需要看到的东西 最好的解决方法是:

  • 在没有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,大多数提升库只是标题 - 他们为什么选择这样做?

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

答案 1 :(得分:2)

就功能而言,这两者是相同的。但是后者只能在Foo.cpp文件中内联。