随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

【02】尽量以const,enum,inline替换#define

1、考虑为什么?

  首先,#define不是语言的一部分,而是预编译过程。也就是在编译器编译之前,进行文本替换。考虑#define Pi 3.1425;在编译之前,Pi都会被文本替换为3.1415,因此编译器看不到Pi这个标识。这会增加调试难度。同时文本替换导致目标码中出现多份3.1415。

2、尽量不使用#define,就要使用替代办法。

3、对于#define Pi 3.1415这样形式,使用const替换const double Pi = 3011415;以const替换#define,有两个特殊情况:

  a、定义常量指针,使用两个const,限制指向对象不能修改,指向不能修改;

  b、class专属常量,它表示的意义是把常量的作用域限制在class内,同时为了该常量只有一份实例,让所有对象共享,声明为static成员。在类中:static const int Max= 100;注意:这是一个声明,而不是定义。我们知道,C++要求对于使用的任何东西必须提供一个定义式,但是对于class专属常量,并且是static同时是整数性的情况,是个例外,也就是说,这种情况不需要定义,就可以使用。但是,如果要娶它的地址,还是要定义一下。

4、旧式编译器可能不支持const-static-int的声明语法,因此必须定义。在类内部,数组必须编译时确定大小,需要使用这个值,怎么办?使用enum。需要说明,使用#define和enum,取它们的地址往往不合法。而取const对象是合法的。

5、#define的另一个用法就是宏,宏表面上是方法,但没有方法调用的额外开销,因为它是文本替换。这往往会出现意想不到的Bug,应该使用inline替换。

6、尽量使用#define的替代品,但并不能完全消除#define,有些地方还必须使用,比如:#ifndef,__LINE__等。

posted on   Andy Niu  阅读(300)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示