是否可以通过 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提供了一些选项来将后行和文件转换为实际代码
答案 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本身打印字符串时,所有这一切当然都有意义。