ANSI-C的编译时查找数组创建?

时间:2010-03-18 17:09:59

标签: c microcontroller lookup-tables compile-time

以前的程序员首选生成大型查找表(常量数组)以节省运行时CPU周期,而不是动态计算值。他通过创建自定义的Visual C ++项目来实现这一点,这些项目对于每个单独的查找表都是唯一的......它们生成数组文件,然后将#included包含在一个完全独立的ANSI-C微控制器(瑞萨)项目中。

这种方法适用于他原来的计算假设,但在需要修改输入参数时变得乏味,要求我重新编译所有Visual C ++项目并将这些文件重新导入ANSI-C项目。我想要做的是将Visual C ++源代码直接移植到ANSI-C微控制器项目中,让编译器创建数组表。

所以,我的问题是:ANSI-C编译器可以在编译期间计算和生成查找数组吗?如果是这样,我应该怎么做呢?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

是否有某些原因导致您无法将代码生成体系结构导入构建系统?

我的意思是,在make中我可能会考虑这样的事情:

TABLES:=$(wildcard table_*)
TABLE_INCS:=$(foreach dir,$TABLES,$dir/$dir.h)
include $(foreach dir,$TABLES,dir/makefile.inc)

$MAIN: $(SRS) $(TABLE_INCS)

其中每个table_*包含一个完整的代码生成项目,其唯一目的是构建table_n/table_n.h。在每个表目录中还有一个名为makefile.inc的makefile片段,它为生成的包含文件提供依赖行,现在我已经删除了递归函数。

完成正确(并且此实现尚未完成,部分原因是这一点更清楚,但主要是因为我很懒),您可以编辑table_3/table_3.input,在主目录中键入make并重建table_3 / table_3.h并逐步重新编译程序。

答案 1 :(得分:1)

我想这取决于您需要查找的值的类型。如果计算每个值的处理要求超过例如持续表达评估可以提供,你将遇到问题。

答案 2 :(得分:0)

查看Boost预处理器库。它是为C ++编写的,但据我所知,这两个预处理器几乎完全相同,它可以做到这一点。