在库中定义常量变量pi

时间:2012-04-17 19:02:55

标签: c++ c cmath

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

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

我认为另一种方式是声明一个内联函数,该函数返回pi的值,但这很难处理。

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

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

6 个答案:

答案 0 :(得分:1)

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

由于常量不是变量,因此可以将其放在头文件中。

答案 1 :(得分:1)

你需要拉入宏#define _USE_MATH_DEFINES

How do I access math constants (eg. M_PI) in Visual C++ 2008?

答案 2 :(得分:1)

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

如果常量是浮点值,则还有一个问题。 C ++要求浮点常量具有分配给它们的存储,并且它们在.cpp文件中初始化,而不是.h文件。这可能使它们的常量效率低于等效的内联函数。这就是Boost库使用内联函数的原因。请参阅this answer

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

答案 3 :(得分:0)

我经常看到头文件中定义的常量变量。你这样做的想法对我来说似乎是合理的。让它静止似乎也可以。

答案 4 :(得分:0)

您还可以将PI常量划分为两个文件,标题和实现。 将声明和实现分开后,您可以更改pi的值(例如更精确),而无需更改接口。

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

extern float pi;

和pi.c:

float pi = 3.14;

答案 5 :(得分:0)

我会将其static const但不是extern并将其放在头文件中。 static const告诉编译器它是一个只能在当前编译单元中访问的常量变量。这允许编译器优化它的任何实际存储,并直接使用该值。