是否有C ++预处理程序指令或类似的可用于转换单位的指令

问题描述 投票:-1回答:3

我正在做一些电动机控制,而不是说39553个编码器滴答声,对我的大脑来说,说6.5英寸会更容易。我想通过在编译时进行转换来节省处理器开销。有没有办法用预处理指令或模板来做到这一点?谢谢。

c++ arduino preprocessor motordriver
3个回答
0
投票

我将为此使用constexpr。正如@ChrisMM所提到的,它不是预处理器,但是它将在编译时而不是运行时进行评估。如果您提供的值与刻度和英寸之间的实际关系相对应,则可以使用:

constexpr int toTicks(double inches) {
    return int(6085 * inches);
}

通过对int进行转换,可以确保您永远不会要求电动机移动刻度线的一部分。唯一需要注意的是,随着时间的流逝,如果您要求电动机移动到一堆不同的位置而又不返回原点,则每次移动都会使原点缓慢地发生舍入误差,从转换到int。


0
投票

您可以使用用户定义的文字。例如,以下是厘米到米的实现:

struct meter {
    double value;
};

constexpr auto operator"" _cm(double cm) -> meter
{
    return meter{cm / 100.0};
}

constexpr auto operator"" _mm(double mm) -> meter
{
    return meter{mm / 1000.0};
}

然后像这样使用它:

auto length1 = 50_cm;
auto length2 = 500_mm;

std::cout << length1.value + length2.value; // prints 1

0
投票

我只用#defines:

#define CM_PER_TICK    0.01
#define toTicks(a)   (a * CM_PER_TICK)

move(toTicks(6.5));

这可以归结为

move(6.5 * 0.01);

通过使用每刻度厘米数而不是每厘米刻度数,我们可以摆脱除法,但您将无法摆脱任何乘法。

© www.soinside.com 2019 - 2024. All rights reserved.