C++程序设计基础(4)宏定义和内联-阿里云开发者社区

开发者社区> ysyouaremyall> 正文

C++程序设计基础(4)宏定义和内联

简介: 1.知识点 1.1宏定义 (1)不带参数的宏定义 1 #define ERROR_MESSAGE -100 2 #define SECONDS_PER_DAY 60*60*60 (2)带参数宏定义,这种形式称为宏函数,但其实并不是函数 #define OUTPUTINT(x) cout
+关注继续查看

1.知识点

1.1宏定义

(1)不带参数的宏定义

1 #define ERROR_MESSAGE -100
2 #define SECONDS_PER_DAY 60*60*60

(2)带参数宏定义,这种形式称为宏函数,但其实并不是函数

#define OUTPUTINT(x) cout<<"INT:"<<x<<endl
#define OUTPUTCHAR cout<<"CHAR:"<<x<<endl

1.2内联函数

宏定义是在预处理阶段进行宏展开的,但是经常会出现一些意想不到的错误,故出现内联函数,内联函数既发挥了宏定义的优势,又弥补了其缺点。

内联函数是在定义时在函数最前面加上inline,或者将函数声明的同时进行定义(这种方式不推荐)。

下面是一个内联函数的例子:

 1 class Rectangle {
 2 public:
 3     Rectangle(int, int);
 4     int getSquare();
 5     int getGirth() { return 2 * (length, width); }        //直接在声明时定义函数,形成内联函数
 6 private:
 7     int length;
 8     int width;
 9 };
10 
11 Rectangle::Rectangle(int l,int w):length(l),width(w){}
12 inline int Rectangle::getSquare() {        //在函数定义时使用inline形成内联函数
13     return length * width;
14 }

2.面试题

2.1简述内联函数和宏定义的区别

相同点:二者都能够节省频繁的函数调用过程中所产生的时间和空间消耗,提高执行的效率;二者都是哦谈过将函数调用替换成完整的函数体,二者的实现也类似。

区别:(1)二者的根本区别在于宏定义仅仅是字符串的替换,并不是函数,而内联函数是函数。

(2)二者的代码展开发生在不同阶段,宏定义是在预处理阶段展开的,而内联函数是在编译阶段展开的。

(3)内联函数作为类的成员函数时,可以访问类的所有成员,包括公有、私有、保护成员,隐式使用this指针,而宏定义无法实现这些功能。

(4)内联函数可以完全替代宏定义,故尽量少使用宏定义。

(5)另外在使用内联函数时要注意代码膨胀问题,内联函数应该尽量简短(另外现在编译器一般都有优化功能,当检测到内联函数代码很长时,不会进行内联,即使使用了内联函数)。

2.2宏定义的宏展开错误

指出下面程序中宏定义的错误并修改

 1 #define MAX(a,b) a>b?a:b
 2 #define MUL(a,b) a*b
 3 int main(int argc, char *argv[]) {
 4     int x = 4, y = 2;
 5     int max = MAX(x, y);
 6     int product = MUL(x, y);
 7     cout << "the max is " << max << endl;
 8     cout << "the product is " << product << endl;
 9     getchar();
10     return 0;
11 }

知识点:宏定义自身缺陷主要是宏展开之后,由于运算符的优先级等原因,使得宏定义展开后的语义和预想的发生偏差。

以下时两个宏展开出错的例子

1 int product=MUL(x,y+32 int max=MAX(x,y)+2
3 
4 //本意是
5 int product=x*(y+3)
6 int max=(x>y?x:y)+2
7 //实际宏展开变成了
8 int product=x*y+3
9 int max=x>y?x:y+2

解决办法包括以下两点:

(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++程序设计课程师生互动(2012年春第9周)
  今天看完同学博客比较早,看空间的动态,同学们还在继续上传。从中午开始,不断地有同学上线,赶在19:00之前传完。今天看得比较粗,很多没有写总结的,我数个数也就过去了;对留了言的,由感而发对上两句;有人提出疑问是必定要解答的,甚至代码中的问题可能还需要我调试一下才能发言。   在拳场上,我们有个规矩:当徒弟的,该怎么练就怎么练,时候到了,师傅自然就会指点。徒弟要主动练,要主动接近师傅。
930 0
《逻辑与计算机设计基础(原书第5版)》——1.3 数制
本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第1章,第1.3节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1006 0
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算
本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第1章,第1.4节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1195 0
Java 发送qq邮件基础和封装
前文摘自 菜鸟教程 :http://www.runoob.com/java/java-sending-email.html 使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) 。
1427 0
+关注
ysyouaremyall
关注人工智能与各学科的交叉发展
61
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载