内联函数和宏定义的区别
用内联函数取代宏:
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定
义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.在类中声明同时定义的成员函数,自动转化为内联函数。
内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。
内联函数要做参数类型检查,这是内联函数跟宏相比的优势。
inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline可以带来一定的效率提升,而且和C时代的宏函数相比,inline 更安全可靠。可是这个是以增加空间消耗为代价的。至于是否需要inline函数就需要根据你的实际情况取舍了。
宏函数的优点:
1. 提高了程序的可读性,同时也方便进行修改;
2. 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率;
3.宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。比如##连接符。
但是它也有自己的缺点:
1. 由于是直接嵌入的,所以代码可能相对多一点;
2. 嵌套定义过多可能会影响程序的可读性,而且很容易出错;
3. 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
补充:预编译语句仅仅是简单的值代替,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患。
的确,宏定义给我们带来很多方便之处,但是必须正确使用,否则,可能会出现一些意想不到的问题。
最后,引用《C陷进与缺陷》的一句话,对其进行总结:
宏并不是函数,宏并不是语句,宏并不是类型定义
inline一般只用于如下情况:
(1)一个函数不断被重复调用。
(2)函数只有简单的几行,且函数不包含for、while、switch语句。
一般来说,我们写小程序没有必要定义成inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline。
宏在C语言里极其重要,而在C++里用得就少多了。关于宏的第一规则是:绝不应该去使用它,除非你不得不这样做。几乎每个宏都表明了程序设计语言里或者程序里或者程序员的一个缺陷,因为它将在编译器看到程序的正文之前重新摆布这些正文。宏也许是许多程序设计工具的麻烦。所以,如果你使用了宏,你就应该准备着只能从各种工具(如排错系统、交叉引用系统、轮廓程序等)中得到较少的服务。
宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗。
宏不是函数,只是在编译前(编译预处理阶段)将程序中有关字符串替换成宏体。
inline函数是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
inline fact(float i) { return i * i; } // 没有写返回值的
printf("bb= %d", fact(8)); // 调用时就是执行printf("bb= %d", 8*8);
关于类的例子:
Class A
{
public:
int readTest()
{
return nTest;
}
void setTest(int i);
};
inline void A::setTest(int i)
{
nTest=i;
};
类A的成员函数readTest()和setTest()都是内联函数,readTest()函数的定义体被放在类声明之中,因而readTest()自动转换成inline函数,setTest函数的定义体在类声明之外,因此要加上inline关键字。