2013-02-10 32 views
3

这是什么实现内联函数对.cpp文件

//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,大部分的升级版本库都只有标题 - 他们为什么选择这样做?

回答

8

这两种方法在最终编译的程序中是否存在差异,还是保证是相同的?

两者都是相同的。
在类/结构体内定义的成员函数隐含地为inline
但是,在第一个示例中,函数在该头部将被包括在内的每个翻译单元中可以是inlined。在第二个例子中,函数只能在定义该函数的cpp文件中内联。这是因为编译器需要在函数调用的时候看到一个函数的定义,以尝试使其内联。

要回答评论问:

比方说你保持在CPP文件A.cpp标记为inline函数的定义,并尝试从另一个CPP文件调用这个函数,B.cpp。您将最终得到一个“未定义的外部符号”错误,这是因为在C和C++中,每个translation unit都是单独编译的,并且在编译B.cpp时位于A.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?


据我所知,大多数升压库的是头只 - 为什么他们不选择这样做呢?

大部分Boost库是模板库和基于模板库的编译器需要看到的定义在使用点,因此模板函数必须在线。
良好阅读:
Why can templates only be implemented in the header file?

+0

“在最终编译的程序中是否存在任何差异” - 差异**存在**,标题中的函数可以在每个翻译单元中内联。 – Csq 2013-02-10 13:18:17

+0

@Csq:好的,我刚刚注意到第二种情况下的定义是在cpp文件中..ahh无赖。你是对的。 – 2013-02-10 13:21:06

+0

@Csq和Alok保存:所以问题是头中函数定义的结束程序会比另一个更大,因为函数代码将在每个翻译单元中,而编译器很可能会忽略内联请求如果函数定义在.cpp文件中?这是你想要创造的点吗? – user2015453 2013-02-10 13:57:30

2

这两个都是平等的,只要它的功能。但后者只能在Foo.cpp文件中内联。