【发布时间】:2015-02-04 23:20:43
【问题描述】:
我有一个项目,它有 1000 多个源 c++ 文件存储在同一目录下的不同文件夹中。我想将日志代码添加到这些 .cpp 文件中定义的所有函数的开头和结尾。请看下面的例子:
//SomeSrcFile.cpp
//Sample
ReturnType SomeClass::SomeFunc1(InputParameters)
{
......
}
ReturnType SomeClass::SomeFunc2(InputParameters) {
......
}
输出
ReturnType SomeClass::SomeFunc1(InputParameters)
{
char FuncName[] = "SomeClass::SomeFunc1()"; //line added
printf("%s begins\n", FuncName); //line added
......
printf("%s ends\n", FuncName); //line added
}
ReturnType SomeClass::SomeFunc2(InputParameters) {
char FuncName[] = "SomeClass::SomeFunc2()"; //line added
printf("%s begins\n", FuncName); //line added
......
printf("%s ends\n", FuncName); //line added
}
如何为这种工作编写shell脚本?这里可以用awk吗?
更新
我认为 AWK 可以像 This Post 那样做到这一点。但我还没想好如何以我的方式去做。
我只想使用 Bash 或 Python 来执行此操作,因为它们只是我现在熟悉的工具。
更新 2
也许这项工作真的很辛苦,出乎我的意料。但是,如果我不关心准确性怎么办?如果我不关心函数包含在 cmets 等中的情况怎么办?没有简单的方法吗?
【问题讨论】:
-
请问您想要完成什么?可能有比日志语句更有用的东西。
-
这样的程序通常也需要解析语法(这不是直接写出来的)。例如,下面的字符串定义
char greeting[] = "void SomeFunc1";可能会使简单的解析器误认为这是一个真正函数的开始。而且 cmets 可能包含会混淆解析器的字符串,所以它也需要解析 cmets... -
@HåkonHægland 是对的,如果没有 C 解析器,您将无法可靠地完成这项工作。例如,当 shell 脚本看到
void SomeFunc2(...) {时,它如何知道它是否位于 C 样式的注释分隔符内? -
像这样调试打印语句是个坏主意。但是,如果您要这样做,请考虑像
PRINT("%s begins\n", __func__)这样的事情,您可以使用预处理器通过__func__获取函数名称,然后定义宏 PRINT,您可以取消定义以删除打印语句。 -
不要修改你的代码,
valgrind --tool=callgrind <program> ...怎么样。虽然我没有使用它们,但似乎有用于 callgrind output format 的可视化工具,以使其密集格式更易于理解。 KCachegrind 在快速搜索中首先出现。
标签: python linux bash shell awk