由于 #ifdef,ctags 在带有不平衡大括号的源文件上阻塞

标签 c c-preprocessor ctags exuberant-ctags

我正在使用 ctags 为我正在处理的 C 项目生成 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;
}

这可以在 Linux 下使用 gcc -Wall 进行编译和工作。但是,如果我使用 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 的替代品感兴趣。

最佳答案

由于 ctags 的问题,我最终使用了 cscope相反。

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

关于由于 #ifdef,ctags 在带有不平衡大括号的源文件上阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5289381/

相关文章:

c++ - 预处理器字符串化宏不起作用

php - PHP/Python/Etc 中内置函数的 ctags 信息

numpy - 用 Python 封装 C++ 和 CUDA

检查定义 GNU C

python - C 中的参数处理错误 : "Expected " + str(status) + "got " + str(child. returncode))"

c - 对静态函数运行单元测试

c -/proc/interrupts 如何更新?

c++ - 使用 C++ 预处理器的二进制表示查找表

ctags 不理解 -e 选项(没有旺盛的标签选项)

c - 函数中的宏行为