1

是否可以通过LINE宏在线报告整个字符串。示例代码:

#include <stdio.h>

#define LOG(lvl) pLog(lvl, __LINE__, __FILE__)

pLog(const char *str, int line, const char *file)
{
    printf("Line [%u]: File [%s]", line, file);
}

int main ()
{
    LOG("Hello"
            "world");
    return 0;
}

输出为:第 [13] 行:文件 [macro.c]

现在在一个大型代码库中,我想搜索此文件并打印报告行中存在的字符串“Hello world”(在本例中为 13)

我在想的一种方法是搜索这个文件,首先使用 gcc -E do grep for pLog 生成输出文件并保存它们的字符串,然后在实际代码文件中 grep for LOG 并保存行号与行号匹配结果然后进行索引匹配并打印字符串。

由于字符串可以分布在多行中(如代码中 Hello 位于一行,world 位于另一行),因此也需要注意这一点。

是否有任何其他最佳和快速的方法或 gcc 提供一些选项来将回行和文件转换为实际代码

4

1 回答 1

1

使用Clang很容易做到这一点。以下命令将文件的抽象语法树 (AST) 转储test.c到文件out

clang -cc1 -ast-dump test.c > out

查看生成文件中的 AST,您可以轻松找到所需的信息:

(StringLiteral 0x1376cd8 <line:12:9, line:13:13> 'char [11]' lvalue "Helloworld")))

Clang 给出字符串的第一个标记的开始(行:12:9)、字符串的最后一个标记的开始(行:13:13)和完整的字符串(“Helloworld”)。

您可以解析 AST 转储或使用 Clang API 来获取相同的信息。如果这不是一次性任务,我会选择 API,因为 AST 转储格式将来更有可能发生变化。

当然,只有当您有理由不在 pLog 本身中打印字符串时,所有这些才有意义。

于 2012-07-03T14:32:19.803 回答