定义常量时包括算术运算

Including arithmetic operations when defining a constant

本文关键字:算术运算 包括 常量 定义      更新时间:2023-10-16

所以我经常看到这样的东西:

#define gf_PI  f32(3.14159265358979323846264338327950288419716939937510)
#define gf_PIhalf  f32(3.14159265358979323846264338327950288419716939937510 * 0.5)

这意味着每次我在代码中使用gf_PIhalf时都会计算一半的PI值,对吗?
直接写成1/2不是更好吗?

这样做不是更好吗?

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510)
const float gf_PIHalf = gf_PI * 0.5f;    // PIHalf is calculated once

最后,这样做不是更好吗(以及为什么它似乎不是一个常见的做法):

const float gf_PI = 3.14159265358979323846264338327950288419716939937510;
const float gf_PIHalf = gf_PI * 0.5f;

这意味着每次我在代码中使用gf_PIhalf时都会计算一半的PI值,对吗?

不,不太可能。

您可以合理地指望您的编译器在编译时执行乘法,而不是在运行时。

您的结论在某种程度上是正确的,除了#define版本几乎肯定会在编译时解决,并且关于类型常量全局变量的部分是不常见的实践。它们是现代优秀代码中的常见做法。对于这种用途,#define几乎是死的。最佳实践是在未命名的命名空间中定义文件作用域全局变量:

namespace
{
    const float g_SomeGlobal = 123.456f;
}

这可以防止翻译单元以外的任何人能够"看到"g_SomeGlobal