使用ctags来方便看CANN代码

本文介绍了在字符界面中使用ctags工具来提升C++代码的浏览和导航效率。通过ctags生成标签文件,可以快速跳转到函数定义,尤其是在没有图形化开发环境的情况下。文章详细阐述了ctags的安装、配置,以及如何处理函数声明和定义的跳转问题,强调了在特定场景下字符界面的便利性。
摘要由CSDN通过智能技术生成

操作界面从字符界面发展到图形界面,是一个进步。而且图形界面也基本上取代了字符界面成为了主流。
但是,这里要说的主要是字符界面上的操作,因为在有些使用场景,字符界面反而是比较方便的。为什么会这样呢?举个例子来说,环境越少,做起事来就越方便。也就是说开发编译和运行程序是在一个环境上,比开发编译一个环境,运行程序又是另外一个环境,是要更方便的。但是只用一套环境呢往往又没有比较方便的图形化的开发环境,所以我们有必要在字符界面也将开发环境整理的比较顺手,至少是查看代码要比较方便。这里就讲一讲如何使用ctags来方便看CANN的样例代码。
ctags可以直接通过发行包来安装:
image.png
简要介绍一下:
Ctags generates an index (or tag) file of C language objects found in C source and header files. The index makes it easy for text editors or other utilities to locate the indexed items.
Ctags can also generate a cross reference file which lists information about the various objects found in a set of C language files in human readable form. Exuberant Ctags improves on ctags because it can find all types of C language tags, including macro definitions, enumerated values (values inside enum{…}), function and method definitions, enum/struct/union tags, external function prototypes, typedef names and variable declarations.
Exuberant Ctags is far less likely to be fooled by code containing #if preprocessor conditional constructs than ctags. Exuberant ctags supports output of Emacs style TAGS files and can be used to print out a list of selected objects found in source files.

在要看的具体代码例子目录下运行ctags,只扫描文件内容判定为c++的文件,除了当前目录,还扫描CANN的头文件目录,当然使用递归扫描。tags文件很快就生成出来了。
image.png

然后进入vim,输入:tag main就可以跳转到main函数的定义处:
image.png

鼠标点击肯定是比键盘移动到某一个代码上是要方便的,所以我们在vim里把鼠标点击打开。
set mouse=a
但是当我们要选择复制出终端(比如MobaXterm)里的一段文字时,这时候选择复制的功能就会失效,我们将鼠标点击关闭就可以了。
set mouse=
把鼠标点到类型名称 pthread_t 上,按C-]进行定义跳转,发现没有跳转。因为这是一个操作系统提供的类型,并没有收录到tags里,所以说:tag not found.
image.png

把鼠标点到函数 setup_acl_device 上,按C-]进行定义跳转,就跳转成功了,到了该函数的定义处:
image.png

这个里面调用了 aclInit ,点上去看看定义,但是tag not found。这是为什么呢?这是CANN里提供的函数,为什么跳转不到定义,前面不是将CANN的头文件收录到tags里了吗?这是因为“函数声明”这一语法元素ctags默认是不记录的,而aclInit应该是只在头文件里声明了函数原型,在库文件里提供了运行代码,CANN并没有提供aclInit的函数定义源代码,所以我们修改一下ctags运行命令,要求ctags记录c++文件中的函数声明和各种外部和前向声明:
ctags -R --languages=c++ --c++-kinds=+px . /usr/local/Ascend/ascend-toolkit/latest/include/
然后就可以跳转到tag aclInit 了:
image.png

这样能够跳转到函数原型,查看原型定义信息,还是比较方便的,比去查文档要方便直接一些,如果有需要再去查阅一下API文档
image.png

现在函数原型声明是可以跳转了,但是又出现了一个问题,那就是函数原型声明和函数定义都有的时候,默认只跳到函数原型了,这可不行。比如前面的函数 setup_acl_device ,把鼠标点到函数 setup_acl_device 上,按C-]进行定义跳转,跳到了原型声明的的头文件里,而不是函数定义里:
image.png

这种情况下,改变跳转的默认行为就可以了,按 g<C-]> 就会弹出tag列表,选择函数定义就可以了:
image.png
这里列出了 函数原型声明和函数定义,我们显然要跳转到函数定义,所以选择2就可以了。

好了,基本用法就介绍到这里,有些常用配置可以放置在vim的启动配置文件中,免去重复输入的麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值