在C ++中,使用#define或const来避免幻数更好吗?

时间:2013-10-27 07:55:07

标签: c++ const c-preprocessor

使用#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相比如何?

3 个答案:

答案 0 :(得分:8)

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

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

阅读Stroustrup的建议总是有用的:"So, what's wrong with using macros?"

答案 1 :(得分:3)

C ++中的“const”非常宝贵。当“#define”d常量刚刚展开时,Consts会在表达式中强制执行类型检查。

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

因此使用consts来定义常量

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

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

答案 2 :(得分:-1)

“const”由于占用内存一次并且每个地方都被引用,因此效率更高。相比之下,“#define”将占用空间和添加操作。