面试笔试(C++部分)
1.define 和const,inline的区别
define的缺点:
1.边界效应(必须加括号,才能避免边界效应)
#define MUL(A,B) A*B
而在使用的时候,这样的调用:
int a=,b=,c=,d=;
d=MUL(a+b,c)
经过编译时候展开,就变成了
d=a+b*c
而不是我们所希望的
d=(a+b)*c
[解决办法]
其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题
即,在宏定义的时候,如此定义:
#define MUL(A,B) ((A)*(B))
2、不能进行类型检查
define定义的变量,是Compile-Time时期的变量,系统在编译时候,就将其全部替换,而不会对其变量进行类型等属性检查,相对不是很安全,可能存在潜在的问题,而没有发现.
正因为其仅仅是编译时期替换,所以其定义的变量,是不会在运行时候分配内存的,不占用内存空间.
const定义的变量,是 Run-Time时期的变量,如果类型不匹配,系统在运行时候,就会发现并提示或报错,对应的,const变量在运行时期,也是一种变量,系统会为其分配内存.
3、编辑前就进行define替代,导致代码难以阅读和维护
4、运行结果的不定性:
#define max(a,b) ((a)>(b)?(a):(b))
int a=,b=; max(++a,b); //a++两次 max(++a,b+); //a++一次
define 和inline的区别:
inline是内联函数,进行函数展开,不需要进行函数调用的过程,有类型检查
define特有的功能,不能被inline和const替代的功能:
用于#include和#ifdef和#ifndef的头文件重复包含
头文件重复包含的坏处:1、有些头文件重复包含只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些
2、有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)
一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。
例如,你想确保头文件max.h不会被重复包含,则你可以采取如下的形式:
第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);
第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。
最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。
但是,即便使用#ifdef #endif ,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将托慢编译速度,所以如果可能,应该避免出现多重包含。
最新文章
- <;<;Exceptional C++>;>; notes
- 每天一个linux命令(58):telnet命令
- H5游戏开发之多边形碰撞检测
- 修改 dispatchTouchEvent方法 来处理事件冲突
- JS中exec函数与match函数的区别与联系
- var隐式类型
- DOM操作应用
- 使用Eclipse设定Android开发环境
- netty高级篇(3)-HTTP协议开发
- BI服务器配置与客户端情况
- TensorFlow构建卷积神经网络/模型保存与加载/正则化
- 关于throw、throws、try--catch的问题
- sql 脚本编写之路 常用语句(一) 1.用一个表中的某一列更新另外一个表的某些列:
- Ubuntu16 搭建Git 服务器
- <;generatePublisherEvidence>; 元素
- 【软工作业&;思考】关于软工的一些概念性理解暨第一次阅读作业
- 动态规划——Distinct Subsequences
- Python读写文件你真的了解吗?
- ORA-00257: archiver error. Connect internal only, until freed……
- 移动设备(手机)的唯一ID有哪些
热门文章
- 路由软件quagga和bird日志配置打印ospf邻居变化
- Linux下查看Nginx的并发连接数和连接状态-乾颐堂
- [Training Video - 6] [File Reading] [Java] Read Properties file
- python可视化
- 使用word写CSDN博客文章
- org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
- 保证Service不被Kill的解决方案
- 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转
- 17、Semantic-UI之分页插件
- INDEX--关于索引的琐碎