前言

先来看一个动图 我们在使用 C/C++ 的时候,或多或少都会碰到宏,不论是自己写的还是别人写的。在使用宏的时候,如果有点复杂那很难看懂,并且非常容易出错,如果能够在编写代码的时候就知道宏展开之后的样子,将会大大提高编码效率,提高正确性。

本篇文章将要介绍在 Emacs 中使用 RTags 来查看宏展开后的样子。

RTags 安装

RTags 是一个 C/S 架构的应用,所以在使用之前要进行安装

后端

macOS

macOS 中可以使用 brew 来快速安装,在终端中输入如下指令

1
brew install rtags

手动安装

Linux 稍微麻烦一点,中需要自己编译源码,如下所示

1
2
3
4
git clone --recursive https://github.com/Andersbakken/rtags.git
cd rtags
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .
make

Emacs

Emacs 中配置也简单,把如下配置拷贝到 Emacs

1
2
3
4
5
(use-package rtags
  :ensure t
  :hook (c++-mode . rtags-start-process-unless-running)
  :config (setq rtags-completions-enabled t
                rtags-autostart-diagnostics t))

使用 RTags 为项目建立索引

在使用之前要先启动后端

1
rdm &

后端启动好之后,就可以建立索引了。但是在为项目建立索引之前需要先对项目进行编译生成 compile_commands.json 文件,然后才能使用 RTags 建立索引,如果你使用的是 CMake 则可以使用下面两条指令建立索引。

1
2
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .
rc -J

除了 CMake 之外还有 ninjaBear 等工具,具体可以查看Usage · Andersbakken/rtags Wiki

宏展开

配置好之后,假设我们想要知道如下代码展开后的代码,只需要在 Emacs 中使用 M-x 执行 rtags-preprocess-file

1
2
3
4
5
6
7
8
#define DEFINE_STRUCT(name, type) \
    struct \
    name { \
        type value; \
    }

DEFINE_STRUCT(Foo, int);
DEFINE_STRUCT(Bar, std::string);

得到展开后的代码如下

1
2
struct Foo { int value; };
struct Bar { std::string value; };

总结

本文简单的介绍了在 Emacs 中使用 RTags 进行宏展开,在开发的时候非常方便调试,可以提前帮我们发现代码中的问题。

除了宏展开还有一些其它的功能,比如查看虚函数的调用 rtags-find-virtuals-at-points 等等,更多的可以参考官网。

参考