内联函数
声明 inline
的函数可以在多个转换单元中定义,前提是所有定义都相同。它也必须在使用它的每个翻译单元中定义。因此,应在头文件中定义内联函数,并且不需要在实现文件中提及它们。
该程序的行为就好像只有一个函数定义。
foo.h
:
#ifndef FOO_H
#define FOO_H
#include <iostream>
inline void foo() { std::cout << "foo"; }
void bar();
#endif
foo.cpp
:
#include "foo.h"
void bar() {
// more complicated definition
}
main.cpp
:
#include "foo.h"
int main() {
foo();
bar();
}
在这个例子中,更简单的函数 foo
在头文件中内联定义,而更复杂的函数 bar
不是内联的并且在实现文件中定义。foo.cpp
和 main.cpp
翻译单元都包含 foo
的定义,但由于 foo
是内联的,因此该程序格式正确。
在类定义(可以是成员函数或朋友函数)中定义的函数是隐式内联的。因此,如果在头中定义了类,则可以在类定义中定义类的成员函数,即使这些定义可能包含在多个转换单元中:
// in foo.h
class Foo {
void bar() { std::cout << "bar"; }
void baz();
};
// in foo.cpp
void Foo::baz() {
// definition
}
Foo::baz
函数是在线外定义的,因此它不是内联函数,不能在标题中定义。