9

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

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

2 回答 2

11

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

不,不太可能。

您可以合理地依靠您的编译器在编译时而不是运行时进行乘法运算。

于 2013-02-28T22:00:16.107 回答
3

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

namespace
{
    const float g_SomeGlobal = 123.456f;
}

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

于 2013-02-28T22:02:12.693 回答