Я использую ctags
для создания файла tags
для проекта C, над которым я работаю, но в этом файле отсутствуют многие функции.По-видимому, это вызвано несбалансированными скобками в исходных файлах из-за использования #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, которые обрабатывают подобные конструкции.