inline函数
1. 实现在 .h 中,未标记inline
每一个包含该头文件的源文件都将得到一份关于该函数的定义,链接器会报函数重定义错误
2. 实现在 .h 中,且标记inline
每一个包含该头文件的源文件都将得到一份关于该函数的定义,但是链接器不会报错
3. 实现在 .c 中,未标记inline
该函数可以被连接到其他编译单元中
4. 实现在 .c 中,且标记inline
该函数对其他编译单元不可见(类似于static),其他源文件不能链接该函数库
当连接到该库的时候会出现 undefined reference to 错误
原理
- 编译器在编译一个inline函数时,需要知道其完整定义,如果编译器在本编译单元找不到inline函数定义就会报错。
- inline函数的调用不涉及到函数的调用,所以不需要链接器参与工作,所以也就不会去其他编译单元查找函数定义。
- 同理。将类的成员函数的实现放在头文件中不会出现重定义错误,是因为在类中定义成员函数默认为inline函数。
建议
1. 在多个 .c 中被调用(类似于extern)
- 将函数的声明放在 .h 中,无需标记 inline。
- 将函数的实现放在 .h 中,并且标记 inline。
2. 只在本地一个 .c 中被调用(类似于static)
- 将函数的声明放在 .c 中,无需标记 inline。
- 将函数的实现放在 .c 中,并且标记 inline。
inline是一种用于实现的关键字,而不是一种用于声明的关键字。所以声明时,无需标记为inline。