You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何排除注释函数,查找源码中实际调用的函数并分类输出

解决C语言函数调用检测(排除注释)的Shell脚本方案

要准确找出functions.txt里的函数在.c源码中是否被实际调用,核心难点是跳过注释内容——直接用grep会把注释里的函数名误判为已调用。下面是一套实用的Shell脚本方案,分步骤处理:

核心思路

  1. 先预处理所有.c文件,彻底移除单行//和多行/* */注释,避免干扰匹配。
  2. 遍历函数列表,在预处理后的源码中搜索函数调用模式(函数名后紧跟(,排除同名变量/文本的误匹配)。
  3. 将结果分别写入used.txt(已调用)和not_used.txt(未调用)。

完整脚本实现

#!/bin/bash

# 1. 预处理所有.c文件,去除注释后存入临时文件
temp_file=$(mktemp)
for c_file in *.c; do
    # 删除多行注释 /* ... */
    sed '/\/\*/,/\*\//d' "$c_file" | \
    # 删除单行注释 // ...
    sed 's//.*$//' | \
    # 移除空行,减少无效内容
    sed '/^[[:space:]]*$/d' >> "$temp_file"
done

# 2. 初始化结果文件(清空已有内容)
> used.txt
> not_used.txt

# 3. 遍历函数列表,逐一检查调用情况
while read -r func; do
    # 跳过空行
    [[ -z "$func" ]] && continue
    # 匹配函数调用:函数名前后可带空白字符,后面紧跟(
    if grep -qE "[[:space:]]${func}[[:space:]]*\(" "$temp_file"; then
        echo "$func" >> used.txt
    else
        echo "$func" >> not_used.txt
    fi
done < functions.txt

# 4. 清理临时文件
rm "$temp_file"

echo "处理完成:已调用函数写入used.txt,未调用函数写入not_used.txt"

关键细节说明

  • 注释处理:用sed分两步清理,先删除多行注释块(/\/\*/,/\*\//d表示从/*到*/的整段删除),再删除单行注释(s//.*$//表示把//及后面的内容替换为空)。
  • 函数匹配正则:[[:space:]]${func}[[:space:]]*\(确保匹配的是函数调用,比如Config()、 Boot(123)这种格式,避免把int Config;或Config_x这类文本误判为调用。
  • 临时文件:用mktemp创建安全的临时文件,处理完自动删除,不会残留垃圾文件。

注意事项

如果你的源码中有**字符串包含函数名+()**的情况(比如printf("Call Config() here");),这个脚本会误判为已调用。如果需要处理这种极端场景,建议用clang等工具分析AST(抽象语法树),但对于绝大多数日常需求,上面的脚本已经足够高效可靠。

内容的提问来源于stack exchange,提问作者gag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:05:21