我怎样才能使用ctags为c源生成正确的标签文件?

时间:2014-09-23 18:24:36

标签: ctags exuberant-ctags

我正在使用Exuberant Ctags v5.8和我要生成标签文件的C源样本如下所示,谢谢!

#define PACK(x) __packed x                                                                                                                                                                                  

typedef PACK(struct) {
    int a;
    int b;
    int c;
} my_struct;

PACK(void *) my_func(PACK(void *) var1, int var2)
{
    *var1 = var2;
    return var1;
}

这是生成的标记文件的内容:

!_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.8 // 
PACK    test.c  /^#define PACK(/;"  d   file: 
PACK    test.c /^typedef PACK(struct) {$/;" f

虽然我预期的标记文件内容应如下所示:

!_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.8 //
a   test.c  /^    int a;$/;"    m   struct:__anon1  file:
b   test.c  /^    int b;$/;"    m   struct:__anon1  file:
c   test.c  /^    int c;$/;"    m   struct:__anon1  file:
my_func test.c  /^void * my_func(void * var1, int var2)$/;" f
my_struct   test.c  /^} my_struct;$/;"  t   typeref:struct:__anon1  file:

如何从原始C源文件中获取后一个标记文件?谢谢!

1 个答案:

答案 0 :(得分:0)

如果不自行预处理文件(例如,使用awk,如上所述)并且使用Exuberant Ctags对预处理版本进行操作,则无法直接完成此操作。

Excrant Ctags使用-I command line option来处理定义。它允许你忽略预处理器定义(例如-I PACK),替换定义(例如-I PACK=FOO),它允许你忽略标识符及其参数列表(例如-I PACK+),但是这些选项都没有处理用其中一个参数替换宏。

您可以考虑将此请求作为新功能,但似乎不再积极开发。最后一次修订是在2009年7月。