ctags 和缩进问题(从源代码中提取函数 definitions/declarations)

Issue with ctags and indent (extract function definitions/declarations from source)

我真的无法在 google 上找到关于此问题的内容。

我想从 .c/.h 文件中解析(获取所有)函数定义和声明。

我了解 ctags、cscope 和 clang (AST)。

因为我喜欢 ctags 的简单性,所以我决定坚持使用它。

我遇到的一个问题是,如果它们之间有换行符,ctags 不会输出整个参数列表,如下所示:

int my_function(
    int a, int b
);

给出输出:

 $ ctags -x --c-kinds=fp so.c
 my_function      prototype     1 so.c             int my_function(

这可以通过 indent:

这样的工具来解决
 $ indent -kr so.c -o so-fixed.c
 $ ctags -x --c-kinds=fp so-fixed.c

 my_function      prototype     1 so-fixed.c       int my_function(int a, int b);

好的,效果很好。直到你不得不处理像这样的可变参数函数:

int my_function(
    int a, int b, ...
);

然后 indent 的输出对我来说不再可用:

int my_function(int a, int b, ...
    );

这里更大的目标是交叉检查头文件中定义的参数名称与实际实现中使用的参数名称。

所以像这样的东西:

header.h

void my_function(int param);

impl.c

void my_function(int something_else) {
}

会被抓到

最终我知道我可以使用 clang 及其 AST 输出。

但是,由于 AST 的复杂性,这是我想尽可能避免的事情。

The bigger goal here is to cross-check parameter names defined in header files with the ones used in the actual implementation.

为此,您可以将 clang-tidy 与 https://clang.llvm.org/extra/clang-tidy/checks/readability-inconsistent-declaration-parameter-name.html

一起使用

Universal Ctags 提供自定义外部参照输出的功能。

$ cat /tmp/bar.c
int f(char /* int */ a,
      // int b, ...
          int
          *c,
          ...
      )
  ;
$ ~/bin/ctags -x --_xformat="%-16N %-10K %4n %-16F %{typeref} %{name}%{signature}" --kinds-C=+p -o - /tmp/bar.c |sed -e 's/typename://'
f                prototype     1 /tmp/bar.c       int f(char a,int * c,...)

另见 https://docs.ctags.io/en/latest/output-xref.html?highlight=_xformat#xformat

要根据需要格式化 return 类型,您可能需要使用 sed。