使用 ctags 或等效浏览字符串化或其他 C 宏技巧生成的代码
Using ctags or equivalent to browse code generated by stringification or other C macro tricks
我正在从事一个非常大的项目,该项目使用通常不太优雅但很有用的 C 宏字符串化技巧来生成动态符号名称,例如:
#define FUNCTION_NAME(signal) (void Callback_ ## signal ## (void))
我将 ctags 与 vim 或 visual studio 代码或 eclipse 结合使用。但是似乎没有办法能够浏览在预处理阶段生成的名称,我明白为什么。
但是尽管项目很大,有没有办法将 ctags 插入构建过程,以便它可以在构建发生时构建索引。或者任何其他解决此问题的方法。
Universal Ctags 可以扩展命令行中定义的宏。 -D
选项可用于此目的。
$ cat -n /tmp/input.c
1 FUNCTION_NAME(term)
2 {
3 /* Do something */
4 }
5
6 FUNCTION_NAME(hup)
7 {
8 /* Do something */
9 }
10
11
$ ~/bin/ctags -D 'FUNCTION_NAME(signal)=void Callback_ ## signal ## (void)' -o - /tmp/input.c
Callback_hup /tmp/input.c /^FUNCTION_NAME(hup)$/;" f typeref:typename:void
Callback_term /tmp/input.c /^FUNCTION_NAME(term)$/;" f typeref:typename:void
另见 https://docs.ctags.io/en/latest/man/ctags.1.html#language-specific-options
我正在从事一个非常大的项目,该项目使用通常不太优雅但很有用的 C 宏字符串化技巧来生成动态符号名称,例如:
#define FUNCTION_NAME(signal) (void Callback_ ## signal ## (void))
我将 ctags 与 vim 或 visual studio 代码或 eclipse 结合使用。但是似乎没有办法能够浏览在预处理阶段生成的名称,我明白为什么。 但是尽管项目很大,有没有办法将 ctags 插入构建过程,以便它可以在构建发生时构建索引。或者任何其他解决此问题的方法。
Universal Ctags 可以扩展命令行中定义的宏。 -D
选项可用于此目的。
$ cat -n /tmp/input.c
1 FUNCTION_NAME(term)
2 {
3 /* Do something */
4 }
5
6 FUNCTION_NAME(hup)
7 {
8 /* Do something */
9 }
10
11
$ ~/bin/ctags -D 'FUNCTION_NAME(signal)=void Callback_ ## signal ## (void)' -o - /tmp/input.c
Callback_hup /tmp/input.c /^FUNCTION_NAME(hup)$/;" f typeref:typename:void
Callback_term /tmp/input.c /^FUNCTION_NAME(term)$/;" f typeref:typename:void
另见 https://docs.ctags.io/en/latest/man/ctags.1.html#language-specific-options