这个
之间的实际差异是什么//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,大多数提升库只是标题 - 他们为什么选择这样做?
答案 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
放在类主体之外。 AFAIK,大多数提升库只是标题 - 他们为什么选择这样做?
大多数Boost库是模板库,对于基于模板的库,编译器需要在使用时查看定义,因此模板函数需要内联。
好读:
Why can templates only be implemented in the header file?
答案 1 :(得分:2)
就功能而言,这两者是相同的。但是后者只能在Foo.cpp
文件中内联。