1

我想为 C 源文件中定义的每个函数查找它被调用的次数以及在哪一行。我是否应该搜索看起来像 C 中的函数定义的模式,然后计算该函数名称出现的次数。如果是这样,我该怎么做?常用表达?任何帮助将不胜感激!

#!/bin/bash
if [ -r $1 ]; then
       #??????
else    
        echo The file \"$1\" does NOT exist
fi      

最终结果是:(请报告任何错误)

 10 if [ -r $1 ]; then
 11         functs=`grep -n -e "\(void\|double\|char\|int\) \w*(.*)"  $1 | sed 's/^.*\(void\|double\|int\) \(\w*\)(.*$/\2/g'`
 12         for f in $functs;do
 13                 echo -n  $f\(\) is called:
 14                 grep -n $f $1 > temp.txt
 15                 echo -n `grep -c -v -e "\(void\|double\|int\) $f(.*)" -e"//" temp.txt`
 16                 echo " times"
 17                 echo -n on lines:
 18                 echo -n `grep  -v -e "\(void\|double\|int\) $f(.*)" -e"//" temp.txt | sed -n 's/^\([0-9]*\)[:].*/\1/p'`
 19                 echo
 20                 echo
 21         done    
 22 else    
 23         echo The file \"$1\" does not exist
 24 fi 
4

2 回答 2

1

这可能有点工作。第一位找到函数定义,如

<datatype> <name>(<stuff>)

并拔出<name>. 然后 grep 获取该字符串。在很多情况下这不起作用,但如果您尝试制作一个适用于某些程序的简单 shell 脚本,这可能是一个不错的起点。

functions=`grep -e "\(void\|double\|int\) \w*(.*)$" -f input.c | sed 's/^.*\(void\|double\|int\) \(\w*\)(.*$/\2/g'`
for func in $functions
do
  echo "Counting references for $func:"
  grep "$func" -f input.c | wc -l
done
于 2012-04-08T13:23:50.647 回答
1

你可以试试这个正则表达式

(^|[^\w\d])?(functionName(\s)*\()

例如搜索所有printf出现

(^|[^\w\d])?(printf(\s)*\()

要使用这个表达式,grep你必须使用选项-E,像这样

grep -E "(^|[^\w\d])?(printf(\s)*\()" the_file.txt

最后一点,这个解决方案错过的是跳过评论块中的出现。

于 2012-04-08T13:32:31.587 回答