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 ...
随机推荐
- FTP文件上传以及获取ftp配置帮助类
帮助类: using QSProjectBase; using Reform.CommonLib; using System; using System.Collections.Generic; us ...
- spring boot日志及Log4j日志配置
1.默认实现的日志配置 Spring boot默认已经集成了logging,同时也是默认开启的,如果想根据自己的需求对日志进行配置,方法很简单--只需要在配置文件中进行相应设置,这里提供我自己的配置如 ...
- The server of Apache (三)——网页优化
在企业中,部署apache后只采用默认的配置参数,会有很多问题,因为那些配置都是针对以前服务器配置的. 一.网页压缩 1.介绍 配置apache的网页压缩功能,是使用Gzip压缩算法来对apache服 ...
- Java create azure web app
create a certificate <java-install-dir>/bin/ keytool -genkey -alias <keystore-id> -keyst ...
- Jenkins持续集成企业实战系列之Jenkins插件下载及邮件配置-----05
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- php 大文件读取
当你需要处理一个5G的文件里面的数据时,你会怎么做,将文件里面的内容全部读取到一个数组里面去? 显然这种做法对小文件是没有问题的,但是对于大文件还是不行的 这时就需要用到 yield 了 ,注意这是 ...
- Ntrip协议使用流程及服务器实现架构
Ntrip协议 在RTK接收机中,有多种方式获取到差分数据:电台.挂外串口.网络等.其中网络方式适合在有网络基准站的地区,省掉携带多一台RTK接收机来完成工作. CORS是网络基准站,通过网络收发GP ...
- ubuntu 上安装支付宝安全插件不能运行问题
1.在ubuntu的firefox浏览器中打开支付宝首页,不能登录,按照提示下载插件 aliedit.tar.gz 2.解压到某个文件夹下,有文件aliedit.sh, 运行 # sh aliedit ...
- C++_标准模板库STL概念介绍5-其他库与总结
C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...
- 24个常用 Python 实现
24个常用 Python 实现 1.冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport(): for i in ...