定义常量时包括算术运算

时间:2013-02-28 21:57:31

标签: c++ constants c-preprocessor

所以我经常看到这样的事情:

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

这意味着每次在我的代码中使用gf_PIhalf时都会计算一半PI值,对吧? 相反,字面上写下一半PI的值不是更好吗?

执行以下操作会不会更好:

#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;

2 个答案:

答案 0 :(得分:11)

  

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

不,不太可能。

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

答案 1 :(得分:3)

您的结论有点正确,除了#define版本几乎肯定会在编译时解决,而关于类型const全局变量的位是不常见的。它们是现代优良代码中的常见做法。 #define对于这种用途几乎已经死了。 最佳做法是在未命名的命名空间中定义文件范围全局:

namespace
{
    const float g_SomeGlobal = 123.456f;
}

这可以防止翻译单元以外的任何人“看到”g_SomeGlobal