我正在编写嵌入式算法。目前我有硬编码的查找表:
static const int32_t sine[65536] = {
...
}
算法应该可以在不同平台上移植,但查找表长度会根据配置和目标平台而变化。
我目前的解决方案使用mako-render(Mako比Jinja2快得多)如下:
<%!
import os
import algo # Local module that contains tools to generate coefs.
from numpy import sin, linspace, pi
a, b, c, d, e = algo.coefficients(os.environ['ALGO_MODE'])
%>
static inline float poly(float x)
{
return x * ( x * ( x * ( x * ${a} + ${b}) + ${c}) + ${d}) + ${e};
}
float sine[] = {
% for y in sin(linspace(0, 2 * pi, 2 ** 16)):
${y},
% endfor
};
在我的Makefile中,我使用它:
in: $(IN)
$(IN): build/headers/%: src/%.in
mkdir -p $(dir $@)
PYTHONPATH=.:$$PYTHONPATH mako-render $< > $@ || true
我喜欢这个解决方案,因为我可以从Python结果中轻松生成C代码:
主要缺点是:
<% %>
),shell(${}
),mako(%
)。.in
扩展名可能会造成混淆,因为autotools和CMake已经使用了此扩展程序。 元编程/代码生成变得非常流行,在我的工作领域,我几乎每天都需要使用这样的魔法。我很惊讶没有像[{1}}那样古老的其他原生解决方案(请不要提及M4 :))。
我可以使用哪种其他解决方案用外部脚本生成的数据填充C 模板?我在这里错过了真正的魔法吗?