【问题标题】:Compile-time lookup array creation for ANSI-C?ANSI-C 的编译时查找数组创建?
【发布时间】:2011-01-29 03:16:36
【问题描述】:

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

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

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

提前感谢您的帮助!

【问题讨论】:

  • 你不能让这个过程自动化吗,例如使用构建脚本和/或嵌套项目?

标签: c microcontroller lookup-tables compile-time


【解决方案1】:

我想这取决于您需要查找的值的类型。如果计算每个值的处理需要的不仅仅是例如常量表达式求值可以提供,但你会遇到问题。

【讨论】:

    【解决方案2】:

    您是否有某些原因无法将他的代码生成架构导入您的构建系统?

    我的意思是,在 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 并增量重新编译程序。

    【讨论】:

    • 这当然是我可以采取的一种方法。因此,根据您的经验,编译器本身无法生成计算出的数组数据,因此我需要依靠外部脚本引擎或二进制文件来完成工作?是否有任何预处理器指令/宏能够计算此类表?
    • @multiproximus:有时你可以用预处理器做一些事情,但如果我没看错你的问题,你继承的代码带有一个有效的代码生成方案,不是吗?这里的想法是利用这一点。所以我会让构建系统来处理代码生成,但你还没有说你用什么来管理你的构建(手工操作,ide builtin,make,scons 等......)。跨度>
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2019-07-04
      • 2011-02-28
      • 2019-06-13
      相关资源
      最近更新 更多