【问题标题】:Defining a constant variable pi in a library在库中定义常量变量 pi
【发布时间】:2012-04-17 19:02:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c++ c cmath


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 然后大概我必须将标头视为 .cc 文件并对其进行编译,以便我可以将其添加到库中?这让我有点恼火——看到 .h 文件像 Makefile 中的 .cc 文件一样被编译 :)
    • @s5s,.h 文件仅在 .cc 文件请求时才编译(通过包含)。记住 .cc 文件是编译单元。
    • @s5s 常量默认具有内部链接(您不需要static) - 这意味着将它们包含在头文件中永远不会有任何问题,无论它被包含的频率如何。
    【解决方案3】:

    您还需要引入宏#define _USE_MATH_DEFINES

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        外部浮点数;

        和 pic.c:

        float pi = 3.14;
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-03
            • 1970-01-01
            • 1970-01-01
            • 2019-05-27
            • 2013-08-07
            • 1970-01-01
            • 2019-04-07
            • 2015-11-09
            相关资源
            最近更新 更多