10.1 内联函数的引出宏函数有一定的缺陷,因此在 C++ 中引出了内联函数说明:自此,可以下结论, C++ 中尽可能少使用宏,宏常量:用 const 修饰的常量代替宏函数:用内联函数代替
缺陷 1:宏函数 需要将实现加 括号,以保证优先级的完整性例:相加宏函数错误用法:define MYADD(x, y) x + yvoid test(){int ret = MYADD(10, 20) * 20; // 10 + 20 * 20cout << “ret = ” << ret << endl; // 结果: 410}正确用法:define MYADD(x, y) ((x)+(y))void test(){int ret = MYADD(10, 20) * 20; // (10 + 20) * 20cout << “ret = ” << ret << endl; // 结果: 600}
缺陷 2:即使加了括号 有些情况 依然有缺陷define MYCOMPARE(a,b) (((a) < (b)) ? (a) : (b))void test(){int a = 10;int b = 20;int ret = MYCOMPARE(++a, b); // 本意: 11 < 20, 返回 11// 但实际上, (((++a) < (b)) ? (++a) : (b)) 11 < 20, 返回 ++a (此时 a=11) 即返回了 12cout << “ret = ” << ret << endl; // 结果: 12}
注意:采用普通函数,反而不会出错int myCompare(int a ,int b) // 普通函数 不会出现 错误{return a < b ? a : b;}void test(){int a = 10;int b = 20;int ret = myCompare(++a ,b) // 返回就是 a 且此时 a = 11cout << “ret = ” << ret << endl; // 结果: 11}但普通函数又不能以空间换时间————————————————————————————————————————————因此引出 C++中的内联函数
10.2 内联函数的几点说明1、 内联函数本身是一个真正的函数 // 但,宏函数不是函数2、 内联函数具有普通函数的所有行为唯一不同之处在于:内联函数会在适当的地方像定义宏一样展开,可以以空间换时间因此, 内联函数既可以避免宏函数的缺陷,也可以避免普通函数入栈的时间浪费3、 在普通函数函数前面加上 inline 关键字使之成为内联函数4、 如果有函数声明,函数本身和声明必须同时加 inline 关键字,否则视为普通函数5、 任何在类内部定义的函数会自动成为内联函数6、 下列情况,普通函数即使指定为内联函数,编译器也可能考虑不按内联编译1)存在任何形式的循环语句2)存在过多的条件判断语句3)函数体过于庞大4)对函数进行取址操作7、 使用方式建议:1)内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议2)如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译(一个好的编译器将会内联小的、简单的函数)因此,不用刻意使用内联函数,可以交给编译器去自行处理
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容