码迷,mamicode.com
首页 > 编程语言 > 详细

“虐心”的获取C++函数列表

时间:2015-05-07 22:10:51      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:c++   函数列表   

今天在这里和大家分享一下如何获取c++文件中的函数列表,问题和灵感来自于同事小W自开发的C++代码覆盖率工具,原理是通过给现有的代码进行打桩,在运行到该函数的时候对该函数进行标记,最终统计得到代码的函数覆盖度。

如图:程序的源代码

技术分享

经过打桩后的代码

技术分享

原理大致如下,这里就不给大家详细介绍了。

那么问题的重点来了,如何解析并且获取cpp文件中的函数呢?

首先想到的方法是的利用编译原理的思想通过添加规则的方法去获取函数,如:对“{”,“}”,“(”,“)”进行字符匹配来判断一个函数的开始和结束。最开始颇有成效,可以款速的分下简单的代码,但是随着在输入法项目中的实战应用出现的问题越来越多。如图,在函数的声明的时候使用了宏定义的情况下对函数判断失败

1. 函数定义中包含宏的情况,没有办法识函数名。

技术分享

2. 函数内部如果使用了宏定义可能会出现括号不匹配的情况导致死循环的出现。

技术分享

等等,随着在项目中的不断深入出现各种各样复杂的环境引发的问题,再对这些问题添加规则规避的同时还可能引发新的问题。每次因为修改问题又引发新问题的同时近乎崩溃!!!

于是乎我们可能需要寻找一种新的方法去得到cpp文件中的函数。灵感一来自于notepad++它是如何对函数进行解析的呢?调研发现notepad++可以使用插件function list对cpp文件进行解析,万幸这个插件是提供源码的!!!发现notepad++解析cpp文件也是按照一定的规则来做的,如图:

技术分享

这样我们只需要把插件重新打包成一个dll文件在我们的工程中使用就可以满足我们的需求了,这样做的优点是节省了我们去编写各种各样的规则,不足之处是对于我们奇葩的代码它还是有无法识别的函数,而且最重要的是我们还不知道如何添加规则,oh my gad!

仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧。答案是:使用__FUNCTION__ 及相关宏。如图:通过宏定义获取函数名。

技术分享

这种方法虽然可行,但是还有一些技术问题没有突破,待小编解决后下次给大家分解。

转载请注明:http://blog.csdn.net/sogouauto

“虐心”的获取C++函数列表

标签:c++   函数列表   

原文地址:http://blog.csdn.net/sogouauto/article/details/45566123

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!