【问题标题】:Replacing macros during compile process在编译过程中替换宏
【发布时间】:2016-01-19 06:18:38
【问题描述】:

我的项目使用了一种日志记录机制,它基本上是在我的每个组件中调用一个宏。

宏的后面是一个函数调用,用于使用像 UART 这样的慢线写入日志。

例子:

LOG("An error has occurred. Please check XYZ. Code: %d", errorcode) 

我不想将整个文本写入 UART,而是想像这样替换每次出现的 LOG:

LOG("12345 %d", errorcode) 

对 LOG 的每次调用都必须替换为简短版本,其中文本替换为唯一编号。动态部分不得更换。唯一编号到原始文本的映射必须放在一个文件中。 像这样的:

12345:"An error has occurred. Please check XYZ. Code:"

在 UART 的另一端,日志阅读器必须读取此映射文件以使其可读。

优点是这对于低带宽来说是完美的。

我的问题: 在编译我的代码时如何做到这一点?我正在使用 gcc 并在 Linux 环境中工作。 我假设预处理器必须处理这个。还是某种预脚本? 或者有没有更好的方法来做到这一点?

【问题讨论】:

  • 我不清楚。你有向UART写字符的功能还是你在找什么?
  • 不,UART 部分正在工作。我只需要知道如何进行上述替换,以减少通过 UART 传输的数据。
  • 好像不是编程问题,而是文本编辑器文本替换问题?只需浏览代码并更改所有消息。另外,如果您关心带宽,为什么要将数据作为 ASCII 中的一些秘密无意义数字发送?如果人类无论如何都无法理解它,请将其作为原始二进制文件发送。两个整数 = 4 或 8 个字节,而不是字符串需要的 10+ 个字节。
  • 我只想在编译过程中进行替换。必须保留原始呼叫。我不能只使用文本编辑器进行替换。我会考虑以原始二进制模式发送它。这样会更有效率。

标签: c gcc logging c-preprocessor uart


【解决方案1】:

您肯定需要一个预处理脚本。 C 预处理器的功能非常有限——几乎仅限于简单的文本替换。如果你所有的 LOG 调用都在 1 行,并且它们的消息都不包含括号,那么你可以使用一个相当简单的文本处理工具来完成它,也许是 awk。如果没有,我会使用一种编程语言,也许是 perl,来构建它。

我假设您的程序中有大量此类 LOG 调用——否则简单地编辑程序可能更有意义。

【讨论】:

  • 我不能保证所有这些都只是单线电话。所以这意味着我不能使用awk?老实说,我以前没有使用过 awk。所以你更喜欢用 perl 编写脚本。将它集成到 makefile 中是否很容易,以便它可以在编译器完成工作之前先运行?是的,这是大量的日志调用。
  • 您也许可以在 awk 中做到这一点,只是您的要求越接近实际解析代码(如编译器),在更简单的工具中工作就越多。 (虽然,我不敢打赌,有些空闲时间过多的人没有用 awk 编写过编译器)。是的,一个 Makefile 可以执行一系列命令,所以在编译中加入一个额外的步骤很容易。
  • 假设我将为此使用 perl 脚本。您是否更喜欢使用一种文本搜索和替换(正则表达式?)?我需要检查是否有可以帮助我的 C 解析器。我真的不想自己写一个:)
  • 除非你的代码非常复杂。我认为比完整解析器简单得多的东西就足够了。粗略地说,我会一口气读完整个文件(参见stackoverflow.com/a/953885/2040863),然后搜索“LOG”,一旦我发现我会调用一个函数来查找两个括号并理解其间的所有内容。重复直到最后。
  • 谢谢,我会试试的!
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多