ctags不是索引类成员函数

时间:2016-02-01 10:06:43

标签: c++ c ctags

我使用ctags索引我的源代码。 为简单起见,我汇总了一些示例代码,如下所示。

namespace test_space
{
template<typename TYPE>
class A
{
public:
    void test_func(TYPE a);
    void test_func_2(TYPE a);
    void test_func_3(TYPE a);
}
class B
{
public:
    void test_func_b();
}

void easy_func()
{
}

}

我将其命名为a.h文件,并使用ctags a.h生成标记文件,但ctags仅索引命名空间,类和函数,但不是我的类成员函数(如test_func ),为什么?如何启用? 这是生成的标签文件内容:

!_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 //
A   a.h /^class A$/;"   c   namespace:test_space
B   a.h /^class B$/;"   c   namespace:test_space
easy_func   a.h /^void easy_func()$/;"  f   namespace:test_space
test_space  a.h /^namespace test_space$/;"  n

1 个答案:

答案 0 :(得分:2)

默认情况下,exuberant-ctags似乎只会在看到定义时添加标记,而不是声明。将班级A更改为

template<typename TYPE>
class A
{
public:
    void test_func(TYPE a)
    {
    }
    void test_func_2(TYPE a);
    void test_func_3(TYPE a);
};

test_func显示在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.9~svn20110310 //
A   a.h /^class A$/;"   c   namespace:test_space
B   a.h /^class B$/;"   c   namespace:test_space
easy_func   a.h /^void easy_func()$/;"  f   namespace:test_space
test_func   a.h /^    void test_func(TYPE a)$/;"    f   class:test_space::A
test_space  a.h /^namespace test_space$/;"  n

但其他功能没有显示出来。我自己不使用ctags,但你通常希望能够找到定义而不是声明是有道理的。

如果你告诉ctags索引原型,你可以得到你想要的东西:

ctags --c-kinds=+p a.h

对于您的示例,这会导致

!_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.9~svn20110310 //
A   a.h /^class A$/;"   c   namespace:test_space
B   a.h /^class B$/;"   c   namespace:test_space
easy_func   a.h /^void easy_func()$/;"  f   namespace:test_space
test_func   a.h /^  void test_func(TYPE a);$/;" p   class:test_space::A
test_func_2 a.h /^  void test_func_2(TYPE a);$/;"   p   class:test_space::A
test_func_3 a.h /^  void test_func_3(TYPE a);$/;"   p   class:test_space::A
test_func_b a.h /^  void test_func_b();$/;" p   class:test_space::B
test_space  a.h /^namespace test_space$/;"  n

您可以获得有关标记内容的更多详细信息:

$ ctags --list-kinds=c
c  classes
d  macro definitions
e  enumerators (values inside an enumeration)
f  function definitions
g  enumeration names
l  local variables [off]
m  class, struct, and union members
n  namespaces
p  function prototypes [off]
s  structure names
t  typedefs
u  union names
v  variable definitions
x  external and forward variable declarations [off]

您可以看到,默认情况下,功能原型未标记。