3

我正在为我正在处理的 C 项目ctags生成tags文件,但文件中缺少许多函数。这似乎是由于使用#ifdef. 一个(简化的)示例:

#include <stdio.h>

struct mystruct {
        long member;
#ifndef _MSC_VER
}__attribute__ ((packed));
#else /* _MSC_VER */
};
#pragma pack(pop)
#endif /* _MSC_VER */

char* greeting_text(){
  return "Hello world\n";
}

int main( int argc, const char* argv[] ){
  char * greeting = greeting_text();
  printf(greeting);
  return 0;
}

gcc -Wall这可以在 Linux 下完美地编译和工作。但是,如果我使用 解析它ctags problem.c,则该tags文件仅包含mystruct-- 缺少函数的条目。

ctags --verbose报告:

OPENING problem.c as C language file
problem.c: unexpected closing brace at line 8
problem.c: retrying file with fallback brace matching algorithm
OPENING problem.c as C language file
problem.c: unexpected closing brace at line 8

所以显然ctags不喜欢文件中的预处理器技巧。

有没有办法ctags处理这个?

的手册页ctags甚至明确提到了这个问题,但表示ctags可以解决这个问题。但是,这似乎不起作用......

这是 Exuberant Ctags 5.8(Debian 软件包 1:5.8-4)。

编辑:

我也对处理这类结构的 ctags 的替代品感兴趣。

4

4 回答 4

2

由于 ctags 的问题,我最终改用cscope

虽然它并不完美,但它比 ctags 更好地处理宏,并且它可以像 ctags 一样与 vim 集成(参见http://vimdoc.sourceforge.net/htmldoc/if_cscop.html#:cscope)。

于 2011-09-02T12:31:09.030 回答
1

您可以尝试重写代码,以便只有一个右大括号,例如:

struct mystruct {
        long member;
}
#ifndef _MSC_VER
__attribute__ ((packed))
#endif
;
#ifdef _MSC_VER
#pragma pack(pop)
#endif /* _MSC_VER */

当然,您可以定义一些方便的宏来使其更易于阅读。

于 2011-03-21T11:01:32.943 回答
1

gcc -E在将文件提供给 ctags 之前,我会尝试在文件上运行预处理器 ( )。这是否会产生一个好的结果我不确定,但值得一试。当然,您的代码的所有组件都应该出现,但是 ctags 会识别 gcc 在输出中留下的其他文件引用吗?没有把握。

于 2011-03-15T11:36:11.087 回答
1

您可以运行该unifdef工具来选择性地(临时)用空行替换代码的非活动部分(unifdef -l -U_MSC_VER)。结果是

#include <stdio.h>

struct mystruct {
        long member;

}__attribute__ ((packed));





char* greeting_text(){
  return "Hello world\n";
}

int main( int argc, const char* argv[] ){
  char * greeting = greeting_text();
  printf(greeting);
  return 0;
}

Ctags 正确解析它没有问题,并且行号保持不变(如果您按行号创建 ctags 搜索,这很重要):

$ cat tags
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.6     //
greeting_text   y.c     /^char* greeting_text(){$/;"    f
main    y.c     /^int main( int argc, const char* argv[] ){$/;" f
member  y.c     /^        long member;$/;"      m       struct:mystruct file:
mystruct        y.c     /^struct mystruct {$/;" s       file:

unifdef在许多操作系统上都可以作为一个包使用(例如 FreeBSD、各种 Linux 发行版、Cygwin)。主页:http ://dotat.at/prog/unifdef/

于 2015-01-16T10:26:13.183 回答