2011-03-13 8 views
2

현재 작업중인 C 프로젝트에 ctags을 사용하여 tags 파일을 생성했지만 많은 기능이 파일에 없습니다. 이것은 #ifdef을 사용하기 때문에 원본 파일의 불균형 중괄호로 인해 발생합니다. A (간체) 예 :이 컴파일 및 리눅스에서 gcc -Wall와 함께 완벽하게 작동#ifdef로 인해 불평형 중괄호가있는 소스 파일에 ctags가 울림

#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; 
} 

. 그러나 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를 대안에 관심이 있어요.

답변

1

전 처리기 (gcc -E)를 ctags에주기 전에 실행 해보십시오. 이것이 좋은 결과를 낳을 지 확신 할 수는 없지만 시도해 볼 가치가 있습니다. 물론 코드의 모든 구성 요소가 나타나야하지만 ctags는 gcc가 출력에 남긴 다른 파일 참조를 인식합니까? 확실하지 않다.

+0

좋은 아이디어. 그러나 문제는'ctags'가 처리하는 중간 파일의 줄 번호가 원본 파일의 줄 번호와 다를 것이므로 ctags를 사용하여 오른쪽 줄로 건너 뛰면 작동하지 않을 수 있다는 것입니다. 아직도, 나는 그것을 시도 할 것이다. – sleske

+0

플러스, 이것은'.h'와'.c' 파일을 하나의 파일에 결합하는 파일도 생성 할 것이므로 ctags가 원래의 소스 파일을 어떻게 찾아야하는지 명확하지 않습니다 ('.c' 파일 또는 포함 된'.h' 파일 중 하나). 내가 볼거야 ... – sleske

+1

전 처리기 출력에는 소스 청크가 온 파일과 라인을 나타내는 지시어가 있어야한다. ctag가 이것을 존중할 것인지 여부는 문제입니다. –

1

당신은 하나의 닫는 중괄호가되도록 예를 들어, 코드를 다시 작성을 시도 할 수 있습니다 :

물론
struct mystruct { 
     long member; 
} 
#ifndef _MSC_VER 
__attribute__ ((packed)) 
#endif 
; 
#ifdef _MSC_VER 
#pragma pack(pop) 
#endif /* _MSC_VER */ 

, 당신이 쉽게 읽을 수 있도록 몇 가지 편리한 매크로를 정의 할 수 있습니다.

+0

물론 코드를 다시 작성할 수는 있지만 프로젝트가 아니기 때문에 수십 곳에서 코드를 다시 작성해야합니다. 나는 이것이 ctags의 버그/결함을 해결하는 좋은 해결책이라고 생각하지 않습니다. – sleske

1

unifdef 도구를 실행하여 코드의 비활성 부분을 빈 줄 으로 선택적으로 (그리고 임시로) 바꿀 수 있습니다.

$ cat 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 /[email protected]/ 
!_TAG_PROGRAM_NAME  Exuberant Ctags // 
!_TAG_PROGRAM_URL  http://ctags.sourceforge.net /official site/ 
!_TAG_PROGRAM_VERSION 5.6  // 
greeting_text y.c  /^char* greeting_text(){$/;" f 
main y.c  /^int main(int argc, const char* argv[]){$/;" f 
member y.c  /^  long member;$/;"  m  struct:mystruct file: 
mystruct  y.c  /^struct mystruct {$/;" s  file: 

unifdef 많은 운영 체제로 볼 수 있습니다 : 결과는

#include <stdio.h> 

struct mystruct { 
     long member; 

}__attribute__ ((packed)); 





char* greeting_text(){ 
    return "Hello world\n"; 
} 

int main(int argc, const char* argv[]){ 
    char * greeting = greeting_text(); 
    printf(greeting); 
    return 0; 
} 

Ctags는이 올바르게 구문 분석 아무런 문제가 없으며 (당신이 줄 번호로 ctags를 검색을 만드는 경우 중요) 줄 번호가 동일하게 유지입니다 패키지 (예 : FreeBSD, 다양한 리눅스 배포판, Cygwin).홈페이지 : http://dotat.at/prog/unifdef/

+0

재미있는 아이디어 (흥미로운 도구). 이것은 "unifdef"입니까? http://dotat.at/prog/unifdef/? – sleske

+0

@sleske 예; 많은 운영 체제에서 패키지로 사용할 수 있습니다 (예 : FreeBSD, 다양한 Linux 배포판, Cygwin). – Jens

+0

@sleske 거기에 몇 가지 버전이 있습니다. '-l' 대신'-b'를 사용하여 공백 행을 대체합니다. – Jens