提取“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
相关推荐
饮啦冰美式15 分钟前
22.04Ubuntu---ROS2使用rclcpp编写节点
linux·运维·ubuntu
wowocpp15 分钟前
ubuntu 22.04 server 安装 和 初始化 LTS
linux·运维·ubuntu
Huaqiwill17 分钟前
Ubuntun搭建并行计算环境
linux·云计算
wclass-zhengge19 分钟前
Netty篇(入门编程)
java·linux·服务器
Lign1731421 分钟前
ubuntu unrar解压 中文文件名异常问题解决
linux·运维·ubuntu
vip4511 小时前
Linux 经典面试八股文
linux
大霞上仙1 小时前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
孤客网络科技工作室2 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
颇有几分姿色3 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
AndyFrank3 小时前
mac crontab 不能使用问题简记
linux·运维·macos