提取“c语言的函数定义“脚本


author: hjjdebug

date: 2024年 08月 11日 星期日 16:35:31 CST

description: 提取c语言的函数定义脚本


c 文件中包含很多函数定义, 我想在每个函数上设置断点.

这需要首先知道所定义的函数名称.

曾经想找一个能提取出c函数名的正则表达式, 网上找了一下,达不到要求.

一个正则表达式是搞不定的.

但我需要一个脚本, 不需要太精确,能大体搞定就可以了.

所以我写了一个脚本,满足如下4个条件才可能是函数定义.

  1. 该行不能包含分号";"

例如: int add(int x, int y);

它只是一个函数声明而不是函数定义

  1. 该行必需有"("

这很明显,没有"("肯定不是函数定义行

  1. 该行必需有")", 并且)到行尾之间不能有除白空格以外的其它东西

例如: if((ret = open_input(filename)) < 0) 就不是函数定义

  1. "(" 前至少有2部分, 返回类型和函数名称

例如: while (a > b) 就不是函数定义

"(" 前只有一部分 while, 所以它不是一个函数

满足这4个条件仍然可能不是函数定义,

是的, 完美判断一个单词是否是函数定义需要词法分析和句法分析,太麻烦.

经过这4个条件过滤,大体都是正确的了,满足了我的要求.

当然如果不满足要求,你还可以再补充.

所以不要迷恋正则表达式,而应该迷恋编程,

艺术品是一刀一刀刻出来的,而不是一蹴而就的.

附: 我写的代码:

复制代码
#!/bin/bash
if [ $# -lt 1 ]
then
	echo "Usage $0 <filename>"
	echo "Usage $0 1.c"
	exit 1
fi
while read line 
do
	if [ "${line/;/}" != "${line}" ]; then  continue;  fi  #包含";" 继续
	if [ "${line/(/}" == "${line}" ]; then  continue;  fi  #不包含"(",继续
	#不包含")\s*$" 继续, 由于用到了正则,所以使用了grep命令,并把输出丢弃
	if ! echo $line |grep ")\s*$" >"/dev/null" ; then continue; fi 

	#提取 "(" 前部分,由它继续过滤
	name0=$(echo $line | awk -F '(' '{print $1}')
	# 函数定义至少要2部分, 第1部分为返回类型,第2部分为函数名, 不满足者继续
	# 多于2部分是可能的, 例如第一部分是修饰词"static" "const" 等
	name=$(echo $name0 | awk -F' ' '{if(NF>=2) print $NF; else print ""}')
	if [ "$name" == "" ] ;then continue; fi # 这会去掉 "if","while"等语句
	echo $name
done < $1
相关推荐
2601_961194022 小时前
27考研刘晓艳单词pdf
linux·sql·ubuntu·华为·pdf·.net
2023自学中3 小时前
imx6ull 开发板 推流ov5640数据,虚拟机用 ffplay 拉流播放
linux·音视频·嵌入式·开发板
shandianchengzi4 小时前
【记录】Ghidra|Ubuntu 26.04 下 Ghidra 界面缩放完整指南
linux·ubuntu·逆向·ghidra
Soari4 小时前
Ubuntu 根分区文件系统损坏,系统启动时自动检查失败
linux·运维·ubuntu
杨云龙UP4 小时前
Oracle Health Check巡检脚本使用SOP V2.0:从HTML原始报告→生成Word专业巡检报告→交付客户_2026-06-03
linux·运维·数据库·sql·oracle·报告·巡检
广州灵眸科技有限公司4 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Linux虚拟机准备
linux·运维·服务器
Peace6 小时前
【Prometheus】
linux·运维·prometheus
日晨难再7 小时前
C语言&Python&Bash&Tcl:全局变量和局部变量
c语言·python·bash·tcl
LZZ and MYY7 小时前
RTS 在windows和Linux之间ShareMem
linux·运维·服务器
aningx7 小时前
openSUSE Leap 16.0 运行 sunshine 报错的解决方法
linux