规范使用C++内联函数
2017-07-25 11:07
337 查看
【学习于C语言中文网,请勿转载】
inline 关键字可以只在函数定义处添加,也可以只在函数声明处添加,也可以同时添加;但是在函数声明处添加 inline 关键字是无效的,编译器会忽略函数声明处的
inline 关键字。也就是说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
尽管大多数教科书中在函数声明和函数定义处都增加了 inline 关键字,但我认为 inline 关键字不应该出现在函数声明处。这个细节虽然不会影响函数的功能,但是体现了高质量 C++ 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。
更为严格地说,内联函数不应该有声明,应该将函数定义放在本应该出现函数声明的地方,这是一种良好的编程风格。
在多文件编程中,我们通常将函数的定义放在源文件中,将函数的声明放在头文件中,希望调用函数时,引入对应的头文件即可,我们鼓励这种将函数定义和函数声明分开的做法。但这种做法不适用于内联函数,将内联函数的声明和定义分散到不同的文件中会出错,请看下面的例子。
main.cpp 代码:
#include <iostream>
using namespace std;
//内联函数声明
void func();
int main(){
func();
return 0;
}
module.cpp 代码:
#include <iostream>
using namespace std;
//内联函数定义
inline void func(){
cout<<"inline function"<<endl;
}
上面的代码能够正常编译,但在链接时会出错。func() 是内联函数,编译期间会用它来替换函数调用处,编译完成后函数就不存在了,链接器在将多个目标文件(
func() 函数的定义,所以会产生链接错误。
内联函数虽然叫做函数,在定义和声明的语法上也和普通函数一样,但它已经失去了函数的本质。函数是一段可以重复使用的代码,它位于虚拟地址空间中的代码区,也占用可执行文件的体积,而内联函数的代码在编译后就被消除了,不存在于虚拟地址空间中,没法重复使用。
内联函数看起来简单,但是有很多细节需要注意,从代码重复利用的角度讲,内联函数已经不再是函数了。我认为将内联函数作为带参宏的替代方案更为靠谱,而不是真的当做函数使用。
在多文件编程时,我建议将内联函数的定义直接放在头文件中,并且禁用内联函数的声明(声明是多此一举)。
inline 关键字可以只在函数定义处添加,也可以只在函数声明处添加,也可以同时添加;但是在函数声明处添加 inline 关键字是无效的,编译器会忽略函数声明处的
inline 关键字。也就是说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
尽管大多数教科书中在函数声明和函数定义处都增加了 inline 关键字,但我认为 inline 关键字不应该出现在函数声明处。这个细节虽然不会影响函数的功能,但是体现了高质量 C++ 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。
更为严格地说,内联函数不应该有声明,应该将函数定义放在本应该出现函数声明的地方,这是一种良好的编程风格。
在多文件编程中,我们通常将函数的定义放在源文件中,将函数的声明放在头文件中,希望调用函数时,引入对应的头文件即可,我们鼓励这种将函数定义和函数声明分开的做法。但这种做法不适用于内联函数,将内联函数的声明和定义分散到不同的文件中会出错,请看下面的例子。
main.cpp 代码:
#include <iostream>
using namespace std;
//内联函数声明
void func();
int main(){
func();
return 0;
}
module.cpp 代码:
#include <iostream>
using namespace std;
//内联函数定义
inline void func(){
cout<<"inline function"<<endl;
}
上面的代码能够正常编译,但在链接时会出错。func() 是内联函数,编译期间会用它来替换函数调用处,编译完成后函数就不存在了,链接器在将多个目标文件(
.o或
.obj文件)合并成一个可执行文件时找不到
func() 函数的定义,所以会产生链接错误。
内联函数虽然叫做函数,在定义和声明的语法上也和普通函数一样,但它已经失去了函数的本质。函数是一段可以重复使用的代码,它位于虚拟地址空间中的代码区,也占用可执行文件的体积,而内联函数的代码在编译后就被消除了,不存在于虚拟地址空间中,没法重复使用。
内联函数看起来简单,但是有很多细节需要注意,从代码重复利用的角度讲,内联函数已经不再是函数了。我认为将内联函数作为带参宏的替代方案更为靠谱,而不是真的当做函数使用。
在多文件编程时,我建议将内联函数的定义直接放在头文件中,并且禁用内联函数的声明(声明是多此一举)。
相关文章推荐
- C++总是能让我想起什么(6)——C++内联函数的使用
- JNI官方规范中文版——如何在JNI中使用己有的C/C++库
- 内联函数inline的使用探索(来自C++primer plus)
- C++中内联函数的使用学习笔记
- 【c++系列】使用标准库规范确保不超出数组边界
- c++内联函数(inline)使用详解
- C++中内联函数的定义和使用
- c++内联函数(inline)使用详解
- C++ 内联函数使用
- C/C++多文件共享全局变量时,使用extern的规范
- c++ 内联函数使用技巧
- C++ inline内联函数使用注意事项
- C++中使用宏需要注意的规范
- [C++]实验四:掌握内联函数的使用、参数个数不确定的函数的设计...
- 避免使用C++异常规范
- C++ 内联函数的使用
- C++中内联函数inline的使用方法
- C++中内联函数的定义和使用
- JNI官方规范中文版——如何在JNI中使用己有的C/C++库
- C++ inline内联函数使用规则