所以我正在编写一个库,我想定义一个具有pi值的常量。我在考虑定义一个静态const float pi = 3.14;在pi.h文件中。
但是,我几乎肯定不是这样做的,因为我读过你不应该在头文件中定义变量。
我认为另一种方式是声明一个内联函数,该函数返回pi的值,但这很难处理。
另一种方式(我认为)是将它放入pi.cc将其编译到库中然后使用extern static const float pi;在你使用pi的任何文件中,当然将这些文件与库链接。
这样做的最佳方法是什么?标准库可能会定义一个宏,但我认为常量更好。
答案 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
告诉编译器它是一个只能在当前编译单元中访问的常量变量。这允许编译器优化它的任何实际存储,并直接使用该值。