4

使用 #define 而不是 const 有哪些优点和缺点(反之亦然)?

当我读到关于糟糕的编程实践,特别是幻数时,我发现自己更频繁地使用#define。一些问题突然出现在我的脑海中,例如:

大量使用#define 是不是很糟糕?
它占用内存空间吗?
改用 const 会更快吗?

我读了一些关于这个但我仍然不确定,根据我的理解:
#define 定义了一个宏(不确定宏是什么意思),它处理预处理。在处理代码之前,它会将已定义关键字的所有实例替换为其他内容。另一方面, const 是变量,其值不能在运行时中途更改。

我能想到使用 const 的唯一原因是该值是否依赖于其他变量。例如:

#define PI 3.14159f
#define RADIUS 3.0f
#define AREAOFCIRCLE PI*RADIUS*RADIUS

效率会很低,因为 AREAOFCIRCLE 的每个实例都将被 PI*RADIUS*RADIUS 替换,因此每次使用 AREAOFCIRCLE 时程序都会为它计算。另一方面:

const float areaofcircle = PI*RADIUS*RADIUS;

会更有效,因为程序只会计算一次。

那么回到最初的问题,#define 与 const 相比如何?

4

3 回答 3

10

在这种情况下不要担心效率,因为所有这些都将在编译时计算。

您应该尽可能停止使用宏(至少定义常量)。宏是针对名称空间和范围的狂野事物。另一方面,const对象具有类型,这可以减少意外错误。

阅读 Stroustrup 的建议总是很有用的:“那么,使用宏有什么问题?”

于 2013-10-27T08:00:36.147 回答
4

C++ 中的“const”是无价的。Consts 在表达式中强制执行类型检查,而“#define”d 常量只是被扩展。

此外,由于常量是类型化的,编译器可能会干扰更好的优化,而定义它必须猜测(1.0 是浮点数还是双精度数?使用后缀作为 1.0d 或 1.0f 可能会有所帮助,但我很少看到如此有意识地编写实数。 ..)。

所以使用 consts 来定义常量

const float PI = 3.14159f;
const float RADIUS = 3.0f;
const float AREAOFCIRCLE = PI*RADIUS*RADIUS;

您将获得至少相同的编译时优化 + 一些额外的类型检查。

于 2013-10-27T08:02:59.313 回答
-1

“const”效率更高,因为它占用内存一次并在每个地方都被引用。相反,“#define”会在任何使用它的地方占用空间和加法运算。

于 2013-10-27T08:17:48.400 回答