博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一篇:尽量多的以 const/enum/inline 替代 #define
阅读量:6992 次
发布时间:2019-06-27

本文共 1221 字,大约阅读时间需要 4 分钟。

前言

       在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡。但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了。

       为何在 C++ 中就要少用了呢?

       这是因为 #define 机制只是简单的字符替换,这样一方面你无法对 #define 定义的东西加入一些C++语法元素,因此限制了面向对象编程语言的威力;

       另一方面编译器不能获取到你所定义的变量类型/函数类型,因此无法提供全面的检测机制,导致隐藏 bug 增多。

       所以要想出对 #define 机制进行替代的思路。

思路一:使用类变量代替宏全局变量

       步骤:

              1. 在类定义式内声明 static 成员

              2. 在类的实现文件内初始化该成员

              3. 由该类派生出的任何对象都可以访问这个成员。

       示例代码:

1 #include 
2 3 using namespace std; 4 5 class CA 6 { 7 public: 8 static const float a; 9 };10 11 const float CA::a = 5.0;12 13 int main ()14 {15 cout << CA::a << endl;16 17 cin.get();18 19 return 0;20 }

思路二:类定义中就要用到的全局常量使用 enum 实现

       在思路一中,如果类 CA 要使用到 a,比如类中要声明一个数组,则下面语句是非法的:int arrayA[a];。为啥?因为在类定义的头文件中,编译器还获取不到 a 的具体值。因此,可以采用所谓的 the enum hack 做法来解决这个问题。

1 enum { ArrayNum=5 };2 int array[ArrayNum];

思路三:采用 template inline 函数代替宏函数

       预处理器的一个很重要的功能是实现宏函数,如下面这个宏函数能够返回 a 和 b 之间较大的值而不论a 和 b的具体类型:

1 #define CALL_WITH_MAX(a, b) f((a)>(b)?(a):(b))

       但这样的实现有好几个漏洞,读者不放试着自己找出来。

       而采用 template inline 函数不单没有这些漏洞,还可以给它添加各种语法机制,比如将它定义为某个类的成员函数。下面的代码演示了 template inline 函数实现改功能的具体做法:

1 template 
2 inline void callWithMax (const T &a, const T &b)3 {4 f(a>b?a:b);5 }

小结

       这三个思路在很多时候都可以替换掉 #define。

       然而,#define 并没有彻底退出舞台,它提供的条件编译功能目前也是非常实用的。

转载地址:http://abbvl.baihongyu.com/

你可能感兴趣的文章
C#ADO.NET基础一
查看>>
一个文字横向滚动的JavaScript文档
查看>>
junit整合spring
查看>>
java正则表达式【大全】
查看>>
mac上git安装与github基本使用
查看>>
如何为引用类型如何重写Object.Equals()方法?
查看>>
下拉顶部刷新简单实现
查看>>
Linux的基本配置
查看>>
Django框架之模型层(二)
查看>>
who 查看系统登录用户
查看>>
java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理...
查看>>
架构师速成6-初中 分类: 架构师速成 2015-0...
查看>>
最新---java多线程下载文件
查看>>
【二】调通单机版的thrift-C++版本
查看>>
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
查看>>
ASP.NET MVC 主要的四种过滤器和三种具体实现类
查看>>
Python中的正则表达式
查看>>
由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射...
查看>>
(转)结构体中使用string所引发的问题
查看>>
Linux查看网卡流量(转)
查看>>