C++程序设计基础(4)宏定义和内联
1.知识点
1.1宏定义
(1)不带参数的宏定义
#define ERROR_MESSAGE -100
#define SECONDS_PER_DAY 60*60*60
(2)带参数宏定义,这种形式称为宏函数,但其实并不是函数
#define OUTPUTINT(x) cout<<"INT:"<<x<<endl
#define OUTPUTCHAR cout<<"CHAR:"<<x<<endl
1.2内联函数
宏定义是在预处理阶段进行宏展开的,但是经常会出现一些意想不到的错误,故出现内联函数,内联函数既发挥了宏定义的优势,又弥补了其缺点。
内联函数是在定义时在函数最前面加上inline,或者将函数声明的同时进行定义(这种方式不推荐)。
下面是一个内联函数的例子:
class Rectangle {
public:
Rectangle(int, int);
int getSquare();
int getGirth() { return * (length, width); } //直接在声明时定义函数,形成内联函数
private:
int length;
int width;
};
Rectangle::Rectangle(int l,int w):length(l),width(w){}
inline int Rectangle::getSquare() { //在函数定义时使用inline形成内联函数
return length * width;
}
2.面试题
2.1简述内联函数和宏定义的区别
相同点:二者都能够节省频繁的函数调用过程中所产生的时间和空间消耗,提高执行的效率;二者都是哦谈过将函数调用替换成完整的函数体,二者的实现也类似。
区别:(1)二者的根本区别在于宏定义仅仅是字符串的替换,并不是函数,而内联函数是函数。
(2)二者的代码展开发生在不同阶段,宏定义是在预处理阶段展开的,而内联函数是在编译阶段展开的。
(3)内联函数作为类的成员函数时,可以访问类的所有成员,包括公有、私有、保护成员,隐式使用this指针,而宏定义无法实现这些功能。
(4)内联函数可以完全替代宏定义,故尽量少使用宏定义。
(5)另外在使用内联函数时要注意代码膨胀问题,内联函数应该尽量简短(另外现在编译器一般都有优化功能,当检测到内联函数代码很长时,不会进行内联,即使使用了内联函数)。
2.2宏定义的宏展开错误
指出下面程序中宏定义的错误并修改
#define MAX(a,b) a>b?a:b
#define MUL(a,b) a*b
int main(int argc, char *argv[]) {
int x = , y = ;
int max = MAX(x, y);
int product = MUL(x, y);
cout << "the max is " << max << endl;
cout << "the product is " << product << endl;
getchar();
return ;
}
知识点:宏定义自身缺陷主要是宏展开之后,由于运算符的优先级等原因,使得宏定义展开后的语义和预想的发生偏差。
以下时两个宏展开出错的例子
int product=MUL(x,y+)
int max=MAX(x,y)+ //本意是
int product=x*(y+)
int max=(x>y?x:y)+
//实际宏展开变成了
int product=x*y+
int max=x>y?x:y+
解决办法包括以下两点:
(1)给参数自身加上括号
(2)给整个宏定义加上括号
其修改结果如下:
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MUL(a,b) ((a)*(b))
2.3内联函数的常识性问题
下列关于内联函数描述错误的是
(A)内联函数可以被重载;
(B)构造函数可以被定义成内联函数;
(C)内联函数能够减少函数调用的开销;
(D)内联函数应该在函数声明时使用inline关键字
答案:D,一定要在定义时使用inline,在声明时使用不会起到任何作用。
C++程序设计基础(4)宏定义和内联的更多相关文章
- 【C语言】预处理、宏定义、内联函数 _
一.由源码到可执行程序的过程 1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件 1 gcc -E test.c -o test.i 2. 编译: 中间文件经过编译器编译形成.s的 ...
- 【C语言】预处理、宏定义、内联函数
一.由源码到可执行程序的过程 1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件 1 gcc -E test.c -o test.i 2. 编译: 中间文件经过编译器编译形成.s的汇编 ...
- __inline定义的内联函数和宏的区别
转自:http://blog.csdn.net/lw370481/article/details/7311668 函数与宏 #define TABLE_COMP(x) ((x)>0?(x):0) ...
- [ 随手记 1 ] C/C++宏,普通函数,内联函数
函数定义 C 语言中的函数定义的一般形式如下: return_type function_name( parameter list ) { body of the function } 在 C 语言中 ...
- 转-C++之虚函数不能定义成内联函数的原因
转自:https://blog.csdn.net/flydreamforever/article/details/61429140 在C++中,inline关键字和virtual关键字分别用来定义c+ ...
- 前序遍历 排序 二叉搜索树 递归函数的数学定义 return 递归函数不能定义为内联函数 f(x0)由f(f(x0))决定
遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...
- C++(十七) — 宏代码、内联函数
1.C++ 表达式返回值 返回引用:当函数返回引用类型时,没有复制返回值.相反,返回的是对象本身.(与之对应的C语言中,返回的是变量的值) C++中,表达式返回的是变量本身(也就是变量对应的地址). ...
- 预处理、const、static与sizeof-为什么不把所有的函数都定义成内联函数
1:内联是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率.如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很小.另一方面,每一处内联函数的调用都要复制 ...
- C语言中宏定义与C++中的内联函数
一,宏定义:在预处理的时候把宏定义的内容替换到代码中,正常编译. 1,无参数宏定义和有参数宏定义 (1)宏定义不能加分号,比如:#define PI 3.24;错的,#define PI 3.24 ...
随机推荐
- sqlServer组合主键
sqlServer 组合主键 创建表时: create table Person ( Name1 ) not null ,Name2 ) not null primary key(Name1,Na ...
- 转载:ResultMap和ResultType在使用中的区别
在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...
- 十、Node.js-url模块
下面使用之前提到过的note交互模式(可以在cmd直接执行js代码)进行学习url模块 跳出note模式同样是Ctrl+C(两次) 学习url模块主要是要掌握url模块的方法: url.parse() ...
- Android手机中怎么样在没root的情况下 修改 hosts 文件
工具 链接:https://pan.baidu.com/s/1AENluDCQ-2qYDPcE5K6l8g 密码:t7eu http://bbs.360.cn/forum.php?mod=view ...
- 【FAQ】服务下线
原因:磁盘已满
- Python实现——决策树(部分函数/连续数据)
由于上一例的实现中只针对了离散数据,为了扩充处理范围,我实现了一下对线性数据的简单处理,在其中我选择用中位数作为指标,平均数.众数等等其他数据在我看来异曲同工,最终也都会有较相似的结构. 求连续数据的 ...
- ubuntu 软件使用
1.制作iso: mkisofs -r -o file.iso your_folder_name/
- Python博文列表
手把手|100行Python代码自动抢火车票!(包教包会):https://zhuanlan.zhihu.com/p/32928355 最全中华古诗词数据库, :https://github.com/ ...
- Ubuntu上使用systemd创建服务文件来启动和监视底层网络应用程序实现守护进程
在Linux上使用Nginx设置ASP.NET Core的托管环境,并部署到它 创建服务文件 创建服务定义文件: sudo vim /etc/systemd/system/kestrel-basic. ...
- PHP脚本占用内存太多,解决方案
Fatal Error: Allowed memory size of xxxxxx bytes exhausted 今天遇到服务器很多自动任务的php脚本占用服务内存过多,并且程序不在运行了. 解决 ...