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 ,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将托慢编译速度,所以如果可能,应该避免出现多重包含。

最新文章

  1. <<Exceptional C++>> notes
  2. 每天一个linux命令(58):telnet命令
  3. H5游戏开发之多边形碰撞检测
  4. 修改 dispatchTouchEvent方法 来处理事件冲突
  5. JS中exec函数与match函数的区别与联系
  6. var隐式类型
  7. DOM操作应用
  8. 使用Eclipse设定Android开发环境
  9. netty高级篇(3)-HTTP协议开发
  10. BI服务器配置与客户端情况
  11. TensorFlow构建卷积神经网络/模型保存与加载/正则化
  12. 关于throw、throws、try--catch的问题
  13. sql 脚本编写之路 常用语句(一) 1.用一个表中的某一列更新另外一个表的某些列:
  14. Ubuntu16 搭建Git 服务器
  15. <generatePublisherEvidence> 元素
  16. 【软工作业&思考】关于软工的一些概念性理解暨第一次阅读作业
  17. 动态规划——Distinct Subsequences
  18. Python读写文件你真的了解吗?
  19. ORA-00257: archiver error. Connect internal only, until freed……
  20. 移动设备(手机)的唯一ID有哪些

热门文章

  1. 路由软件quagga和bird日志配置打印ospf邻居变化
  2. Linux下查看Nginx的并发连接数和连接状态-乾颐堂
  3. [Training Video - 6] [File Reading] [Java] Read Properties file
  4. python可视化
  5. 使用word写CSDN博客文章
  6. org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
  7. 保证Service不被Kill的解决方案
  8. 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转
  9. 17、Semantic-UI之分页插件
  10. INDEX--关于索引的琐碎