这之间的实际区别是什么
//Foo.h
struct Foo {
void bar() {
//lots of complex statements
}
};
Run Code Online (Sandbox Code Playgroud)
还有这个
//Foo.h
struct Foo {
void bar();
};
//Foo.cpp
inline void Foo::bar() {
//lots of complex statements
}
Run Code Online (Sandbox Code Playgroud)
这两种方法在最终编译程序中是否有任何差异,或者保证是否相同?
还请就哪些人应该选择以及为什么在良好的编码实践/经验方面做出一些评论.请注意"许多复杂的陈述".这些事情应该在头文件中的任何特定情况?AFAIK,大多数提升库只是标题 - 他们为什么选择这样做?
这两种方法在最终编译程序中是否有任何差异,或者保证是否相同?
两者都是一样的.
在类/结构体内定义的成员函数是隐式的inline.
但是,在第一个例子中,函数可以inline在每个包含该标题的翻译单元中.在第二个示例中,函数只能在定义函数的cpp文件中内联.这是因为编译器需要在函数调用点看到函数的定义,以尝试使其内联.
在评论中回答Q:
假设您将函数的定义标记为inline在cpp文件中,A.cpp并尝试从另一个cpp文件调用此函数,B.cpp.最终会得到一个"未定义的外部符号"错误,这是因为在C和C++中,每个转换单元都是单独编译的,并且编译时函数的定义A.cpp不可用B.cpp.
如果仅从A.cpp定义函数调用该函数,则该定义在同一文件中可用,并且编译器和链接器很乐意编译并链接到该函数.
C++ 03 7.1.2函数说明符:
第3段:
类定义中定义的函数是内联函数.内联说明符不应出现在块作用域函数声明中.
在良好的编码实践/经验方面,应该选择哪一个以及为什么?
类定义用作类的用户的接口.此接口的用户无需查看功能的实现细节.他们需要看到的是如何使用这个界面.通过在类中放置函数定义(如你所提到的那么长),你向用户提供了不必要的细节,从而使他们很难看到他们真正需要看到的内容.
最好的方法是:
inline关键字&的类定义中声明函数inline放在类体外. Good Read:
对于在类外部定义的内联成员函数,最好将inline关键字放在类主体中的声明旁边,在类主体外面的定义旁边,或者两者兼而有之?
AFAIK,大多数提升库只是标题 - 他们为什么选择这样做?
大多数Boost库都是模板库,对于基于模板的库,编译器需要在使用时查看定义,因此模板函数需要内联.
好读:
为什么模板只能在头文件中实现?