第一篇:尽量多的以 const/enum/inline 替代 #define
2024-09-05 14:48:35
前言
在面向过程语言,如 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 并没有彻底退出舞台,它提供的条件编译功能目前也是非常实用的。
最新文章
- 表单元素——checkbox样式美化
- linux RPM、YUM
- 20145304 Java第六周学习报告
- FIFO跨时钟域读写
- linux内核分析课程笔记(二)
- SGU326 Perspective(指派问题)
- javascript设计模式学习之十五——装饰者模式
- Axure简介
- SQLite 学习流水账笔记
- 关于ASP.NET MVC中的视图生成
- android源代码百度网盘分享
- 腾讯云部署Flask应用
- 【JavaScript】Js控制页面所有元素只读
- Ansible系列(六):各种变量定义方式和变量引用
- Linux中文件夹的文件按照时间倒序或者升序排列
- Linux的常用命令(1) - 指定运行级别
- ReentrantLock示例说明
- vue间通信
- [SP1043] GSS1 - Can you answer these queries I
- kolla-ansible源码分析
热门文章
- float过后 高度无法自适应的解决方法
- android EditText inputType 及 android:imeOptions=”actionDone”
- ubuntu ss 搭建(tizi_服务端
- 【Dos】Dos命令大全
- linux socket读数据错误解释
- OUTLOOK之不能直接发送邮件的Mapi错误解决方法
- java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map
- C语言基础(19)-结构体,联合体,枚举和typedef
- shell脚本之read工具
- 使用httpClient发送get\post请求