【问题标题】:C how to convert large list of defines to strings for comparison to user input stringC如何将大型定义列表转换​​为字符串以与用户输入字符串进行比较
【发布时间】:2015-06-27 12:58:15
【问题描述】:

我阅读了一篇有趣的answer,关于如何使用巨大的 switch 语句将定义的错误代码列表从错误代码转换为错误字符串。不过我有一个稍微不同的问题。

给定一个包含数千个寄存器定义的大文本文件,即:

#define setup_register 0x01

我希望能够从命令行获取输入,例如write setup_register 0xFF。然后在我的代码中查找 setup_register 的地址 (0x01) 并写入它。

是否有 C 方法可以获取 setup_register 地址?我想我可以解析文件并创建一个新文件,或者手动执行,但这意味着每次更改时都必须执行。

【问题讨论】:

  • 您说的是“一个大的文本文件”,但示例内容具有C宏定义的形式。有问题的文件实际上是在程序编译期间可用的 C 源文件(可能是头文件),还是真的用作纯文本文件(意味着程序在运行时读取它)?
  • 抱歉,这是一个非常大的 C 源文件。上面表格中的一长串#define 语句。

标签: c


【解决方案1】:

setup_register 是 C 预处理器符号。如果是macro argument,则可以对此类符号进行字符串化。否则据我所知是做不到的。

我会用你最喜欢的脚本语言(Ruby、Python、Perl)编写一个脚本,它会查找“#define [A-Za-Z_]+ 0x[0-9a-fA-f]+”形式的行,然后解析出名称并生成具有字符串和相应值的结构数组。对字符串进行哈希处理,将结构放入哈希表中,就可以开始了。

【讨论】:

  • 其实预处理器有一个操作符(#)用于将预处理器符号转换为C字符串,所以setup_register等。人。 可以作为字符串提供给代码。这并不一定意味着按照您的描述处理所有这些定义是一个坏主意,但请尽量避免断言虚假。
  • 确实,我会采用一种或另一种机制来构建以字符串为键的哈希表。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多