如何获取__LINE__报告的整个字符串

时间:2012-07-03 14:04:00

标签: c shell

是否可以通过 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;
}

输出为:Line [13]:File [macro.c]

现在在一个庞大的代码库中,我想搜索这个文件,并在报告的行上打印字符串“Hello world”(在这种情况下它是13)

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

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

还有其他最好的快速方式吗或gcc提供了一些选项来将后行和文件转换为实际代码

1 个答案:

答案 0 :(得分:1)

使用Clang非常容易。以下命令将文件test.c的抽象语法树(AST)转储到文件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)和完整的字符串(&#34; Helloworld&#34;)

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

当你有理由不在pLog本身打印字符串时,所有这一切当然都有意义。