【问题标题】:How to exchange a string with an index during C preprocess如何在 C 预处理期间用索引交换字符串
【发布时间】:2018-12-05 17:11:20
【问题描述】:

我有几个 C 源跟踪语句,比如

TRACE(23, "abc"); 
TRACE(24, "def");

数字 23 和 24 是从自动生成的列表中计算出来的标识符,每行包含一个字符串

...
"abc"
"def"
...

“abc”在第 23 行,所以我在适当的跟踪语句中写了 23。

预处理器生成我想要的输出

trace(23);
trace(24);

我认为应该可以以我只写的方式自动化它

TRACE("abc"); 
TRACE("def");

在 C 预处理期间,我想自动将字符串与生成的文件的适当行号交换,以便进入预处理器输出

trace(23);
trace(24);

我可以编写一个函数,它返回字符串“abc”的第 23 行,但我需要在预处理过程中激活它。有没有预处理器钩子或其他想法?

【问题讨论】:

  • 请详细说明。 “我有资源”,请举例说明。 “生成的文件”请显示。 “我想...”,请为示例输入显示一些所需的输出。还请描述您尝试过的内容,以展示自己的一些研究工作。也许您可以展示您所做的某些事情,但并不完全是您想要的。一般尽量避免“这里有要求,请给出代码”的印象。
  • 您这样做是为了达到什么目的?编译器宏 __LINE____FILE__ 可以提供帮助吗?
  • 它是一款适用于非常小型嵌入式系统的软件跟踪器。跟踪字符串不会进入目标。它们由 PC 工具动态加载。目标发送 23 并且主机知道它是“abc”。我知道__LINE____FILE__,但我不知道他们在这种情况下如何帮助我。

标签: c string indexing c-preprocessor


【解决方案1】:

预处理器提供您可以使用的自动宏 __FILE____LINE__(以及其他一些):


#include <stdio.h>

#define TRACE(m) fprintf(stderr, "%s,%d: %s\n", __FILE__ , __LINE__, m)

int main(void)
{
int a;

if(a) TRACE("a");
else TRACE("no");

TRACE("returning");

return 0;
}

【讨论】:

    【解决方案2】:

    我现在有个想法:让预处理器生成这个输出:

    trace("abc"); 
    trace("def");
    

    而不是编写一个工具(即带有 awk 的 bash 脚本)将字符串与生成的列表文件中的行号交换:

    ...
    "abc"
    "def"
    ...
    

    最后让编译器完成他的工作。我对它不是很满意,因为它需要针对每个编译器进行调整。有更好的主意吗?

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2011-01-12
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多