运行 包含头文件时的函数 c++

Run function when header is include c++

我正在单个头文件中构建快速三角函数逼近。

#ifndef COOL_MATH_H
#define COOL_MATH_H

#include <cmath>
const float PI = std::acos(-1);
namespace trigonometry
{
    namespace
    {
        float _cos[180];
    }

    void init()
    {
        for (int i = 0; i < 90; i++)
        {
            _cos[i] = cosf(float(i) * PI/180.0f);
        }
    }

    float cos(float deg)
    {
        int nearest = int(abs(deg) + 0.5) % 90;
        return _cos[nearest];
    }

    float sin(float deg)
    {
        return cos(90.0f - deg);
    }
}

#endif

如果我错了请纠正我,但这个近似值理论上比内置三角函数更快?

主要问题是: 如果包含头文件(即只有一次),我如何 运行 函数 trigonometry::init()?我只想存储 _cos[180] 的值一次。

How can I run the function trigonometry::init() when the header file is included (i.e. only once)?

#ifndef COOL_MATH_H
#define COOL_MATH_H

#include <cmath>
#include <array>

const float PI = std::acos(-1);
namespace trigonometry
{
    namespace
    {
        std::array<float, 180> init()
        {
            std::array<float, 180> cos;
            for (int i = 0; i < 90; i++)
            {
                cos[i] = cosf(float(i) * PI/180.0f);
            }
            return cos;
        }
        std::array<float, 180> _cos = init();
    }

    float cos(float deg)
    {
        int nearest = int(abs(deg) + 0.5) % 90;
        return _cos[nearest];
    }

    float sin(float deg)
    {
        return cos(90.0f - deg);
    }
}

#endif

请注意,包括您的 cool_math.h 在内的每个翻译单元都有自己的数组 float _cos[180] 和弱函数。要在所有翻译单元之间共享唯一的 float _cos[180],您需要将数组和函数定义移动到 cool_math.cc,或者将它们声明为某些 class 的静态成员并定义 float _cos[180] 在 cool_math.cc.