2

所以我正在编写一个库,我想定义一个具有 pi 值的常量。我正在考虑定义一个 static const float pi = 3.14; 在 pi.h 文件中。

但是,我几乎可以肯定这不是这样做的方法,因为我已经读过你不应该在头文件中定义变量。

我认为的另一种方法是声明一个返回 pi 值的内联函数,但这很难使用。

另一种方法(我认为)是把它放在 pi.cc 编译到库中,然后使用 extern static const float pi; 在您使用 pi 的任何文件中,当然也可以将这些文件与库链接。

这样做的最佳方法是什么?标准库可能会定义一个宏,但我认为常量更好。

4

6 回答 6

1

您还需要引入宏#define _USE_MATH_DEFINES

如何在 Visual C++ 2008 中访问数学常量(例如 M_PI)?

于 2012-04-17T19:15:00.357 回答
1

我的建议是将常量放在头文件中。常量将给出值类型信息,这是一件好事。

由于常量不是变量,所以可以放在头文件中。

于 2012-04-17T19:08:44.403 回答
1

不将常量放在头文件中的一个原因是避免在常量更改时使用库重新编译代码(而不仅仅是重新链接)。这个原因不适用于像 π 这样在维护程序时永远不会改变的常量。

如果常量是浮点值,还有一个额外的问题。C++ 要求浮点常量具有分配给它们的存储空间,并且它们在 .cpp 文件中进行初始化,而不是在 .h 文件中。这会使它们的常量比等效的内联函数效率低。这就是 Boost 库使用内联函数的原因。看到这个答案

因此,对于您的情况,最好的选择可能是使用 Boost 库,或者如果您不想使用依赖项,则只需创建一个执行相同操作的内联函数。

于 2012-04-17T19:16:48.403 回答
0

我经常看到头文件中定义的常量变量。你这样做的想法在我看来是合理的。使其成为静态似乎也可以。

于 2012-04-17T19:06:38.517 回答
0

你也可以将你的 PI 常量分成两个文件,头文件和实现。将声明和实现分开后,您可以在不更改接口的情况下更改 pi 的值(例如更精确)。

这可以通过简单的 pi.h 文件:

外部浮点数;

和图片:

float pi = 3.14;
于 2012-04-17T19:28:37.920 回答
0

I would make it static const but not extern and place it in a header file. static const tells the compiler that it's a constant variable accessible only in the current compilation unit. This allows the compiler to optimize away any actual storage for it and just use the value directly.

于 2012-04-17T19:50:00.217 回答