前言

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

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

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

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

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

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

步骤:

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

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

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

示例代码:

 #include <iostream>

 using namespace std;

 class CA
{
public:
static const float a;
}; const float CA::a = 5.0; int main ()
{
cout << CA::a << endl; cin.get(); return ;
}

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

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

 enum { ArrayNum= };
int array[ArrayNum];

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

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

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

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

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

 template <typename T>
inline void callWithMax (const T &a, const T &b)
{
f(a>b?a:b);
}

小结

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

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

最新文章

  1. 表单元素——checkbox样式美化
  2. linux RPM、YUM
  3. 20145304 Java第六周学习报告
  4. FIFO跨时钟域读写
  5. linux内核分析课程笔记(二)
  6. SGU326 Perspective(指派问题)
  7. javascript设计模式学习之十五——装饰者模式
  8. Axure简介
  9. SQLite 学习流水账笔记
  10. 关于ASP.NET MVC中的视图生成
  11. android源代码百度网盘分享
  12. 腾讯云部署Flask应用
  13. 【JavaScript】Js控制页面所有元素只读
  14. Ansible系列(六):各种变量定义方式和变量引用
  15. Linux中文件夹的文件按照时间倒序或者升序排列
  16. Linux的常用命令(1) - 指定运行级别
  17. ReentrantLock示例说明
  18. vue间通信
  19. [SP1043] GSS1 - Can you answer these queries I
  20. kolla-ansible源码分析

热门文章

  1. float过后 高度无法自适应的解决方法
  2. android EditText inputType 及 android:imeOptions=”actionDone”
  3. ubuntu ss 搭建(tizi_服务端
  4. 【Dos】Dos命令大全
  5. linux socket读数据错误解释
  6. OUTLOOK之不能直接发送邮件的Mapi错误解决方法
  7. java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map
  8. C语言基础(19)-结构体,联合体,枚举和typedef
  9. shell脚本之read工具
  10. 使用httpClient发送get\post请求