2009-04-24 2 views
2

전처리 지원을 사용하는 C 용 리팩토링 도구를 사용 중입니다 ... 큰 C 프로젝트에 관련된 리팩터링 유형을 알지 못하고 실제로 사람들이 무엇을하는지 알고 싶습니다. 리팩토링 할 때 C 코드 (및 전 처리기 지시문)C와 C 전처 리기 리팩토링

정말 재미있을만한 기능이 어떤 도구에도 없으므로 리팩토링이 완전히 수동으로 수행되어야한다는 것을 알고 싶습니다. 예를 들어 Xref가 반복자로 사용되는 매크로를 리팩토링 할 수 없다는 것을 보았을 때 (정확히 무슨 뜻인지는 모르겠다.) ...

감사합니다.

+0

"C + CPP"란 무엇입니까? –

+0

나는 그가 C와 C++을 의미한다고 생각한다. – Zifre

+0

나는 C Preprocessor를 의미하지 않았다. 나는 그것에 집중했다. .. 미안하다. :-) – LB40

답변

0

Java와 마찬가지로 C++ 리팩터링을위한 좋은 도구가 없다는 것을 솔직하게 말할 것입니다. 그것의 대부분은 고통스런 수색과 교체가 될 것이지만 이것은 실제 작업에 달려 있습니다. Netbeans 및 Eclipse C++ 플러그인을 살펴보십시오.

내가 외부 참조가

이 정직하게 (즉, 비록 뜻을 정확히 를 모르는) 반복자로 사용되는 매크로를 리팩토링 수 없다는 예를 들어 본 적이에게, 당신은 수 있습니다 당신의 머리 위로 - 당신이이 일에 적합한 사람인지 생각해보십시오.

2

거대한 주제!

  • 내가 정리해야 할 물건 #ifdefs의 뒤틀린 둥지입니다. 리팩토링 도구는 인수 목록 (함수 선언 또는 정의)에 조건부 항목이 나타나는 것을 이해하고이를 개선합니다. 정말 좋았다 경우

  • , 그것은

    #if defined(SysA) || defined(SysB) || ... || defined(SysJ) 
    

    가 정말 동등한 것을 인식 할 것이다 :

    #if !defined(SysK) && !defined(SysL) 
    

    당신은 내가 놀랄 것 것을 관리합니다.

  • '이 매크로는 이제 정의되었습니다 - 어떤 코드가 표시되는지'(컴파일러에서 볼 수 있음)를 지정할 수 있습니다. 보이지 않는 코드를 보도록 선택할 수도 있습니다.

  • 100 개가 넘는 최상위 디렉토리에 걸쳐 시스템을 처리하고 그 하위 디렉토리의 레벨을 다양하게 조정합니다. 그것은 장소에서 20K 라인의 길이와 함께 수만 개의 파일을 처리 할 것입니다.

  • 매크로 정의가 헤더 파일 (aargh!) 대신 makefile에서 오는 위치를 식별합니다.

+0

제가 알고있는 거대한 주제입니다 ... 명령 줄 매크로는 끔찍합니다 ... :) ... 매크로 간의 상호 제외는 불가능합니다. 리눅스 커널에서 Kconfig 언어를 보았습니다 ... 이런 종류의 일로 트릭을 할 수 있습니다 ... thanks – LB40

+0

DMS Software Reengineering Toolkit을 참조하십시오. 이전에 사용 된 많은 작업 중 하나는 전 처리기 조건을 단순화하는 것입니다. 같은 웹 사이트에서이 주제에 대한 논문을보십시오. 당신의 예제는 추가 규칙을 추가하지 않고서는 (L 개의 상호 배타적 인 스위치 만 있다는 지식을 얻을 수있는 곳은 없지만) 실제로는 그 규칙을 정확하게 추가 할 수 있습니다. 요청한 모든 작업을 수행하며 3 천 5 백만 라인의 C 코드 시스템에 적용하여 입증되었습니다. –

+0

@Ira Baxter : 정보 주셔서 감사합니다. 주석은 HTML 앵커 표기법을 허용하지 않으므로 웹 사이트가 '' "> DMS''를 끝으로 인식하지 못하기 때문에 링크를 클릭하면 흉상으로 보입니다. –

1

매크로가 자주 복잡해질 수 있으므로 매크로를 단순하게 이름을 바꾸는 것 이상으로 지원하지 않습니다.

+0

통증이 없다 ... cpp는 아주 둔 해지지만 그것을 지원하고 그것을 처리 할 방법을 찾아야한다 ... 그건 내 일이다 ... :-) – LB40

+0

글쎄, 행운을 빈다. – splicer

0

임의의 복잡한 디렉토리 계층 구조를 가진 큰 프로젝트에서 다양한 유형, 변수 및 매크로의 이름을으로 신뢰할 수있게 처리 할 수 ​​있다면 귀하의 제품을 사용하고 싶습니다.

+1

혹시 Coccinelle을 사용해 보셨나요? 그것은 그 목적을 위해 리눅스에서 잘 작동합니다! 어쩌면 매크로를 제외하고 ... – Nico

2

음, 전처리 기의 일부이기 때문에 ...#include 리펙토링은 거대한 주제이며 실제로 잘 수행 할 수있는 도구는 알지 못합니다.

사소한 문제 도구 태클 수 :

  • 중복 외부 경비를 추가 자동으로 규칙을 지키는 일관성있는 헤더를 적용 #include를 일관된 케이스와 백 슬래시 사용을 강제 도구가 해결할 수있는 더 까다로운 문제 :

    • 찾기 및 r emoving 가짜 포함합니다.
    • 실용적인 경우 항상 미리 선언문을 사용하는 것이 좋습니다.

    매크로의 경우 ... 아마 어떤 종류의 범위 지정이 재미있을 것입니다. # 매크로를 블록 내에 정의하면 # 블록의 끝에이 매크로가 자동으로 #undef됩니다. 내가 생각할 수있는 다른 빠른 일 : 많은 사람들이 여전히 {} 않지만 (0) 및 기타 기술을 사용 해야할지하지 않는

    • 매크로 안전에 대한 빠른 분석이 도움이 될 수 있습니다.
    • 또는 매크로 매개 변수로 부작용이있는 표현식이 전달되는 부분을 찾아 표시하십시오. 이것은 의도하지 않은 부작용이있는 주장에 도움이 될 수 있습니다. 이에 관심 (C에 해당)
  • +0

    이 #include 문제를 알고 있습니다 ... 나는 이미 그것에 대해 작업하고 있습니다 ... 당신은 preeclaration을 무엇을 의미합니까? 나는 분석하는 동안 (매크로 정의 끝에 ';'가있는 경우) ... 부작용이 힘들다고 생각했다 ... thr ... – LB40

    +0

    사전 적으로 말하면 ... 사람들은 종종 "struct MyStruct;"로 미리 선언 할 수있을 때 헤더를 #include하여 struct 정의를 얻습니다. 이런 종류의 상황을 찾아 내고 표시하는 것은 정말 도움이 될 수 있으며 쉽습니다. 그것은 "파일에서 구조체가 사용 되었습니까? 모든 경우에 포인터 또는 참조로 사용됩니까? 파일에 정의되어 있습니까? 아니요? 그렇다면 미리 선언 될 수 있고 포함이 잠재적으로 제거 될 수 있습니다." –

    3

    누구는 coccinelle tool 한 번 봐 걸릴 수도 있습니다 :

    Coccinelle 언어 SMPL (시맨틱 패치 언어)를 제공하는 프로그램 매칭과 변환 엔진입니다 C 코드에서 원하는 일치 항목과 변환 항목을 지정합니다. Coccinelle은 초기에 Linux에서 부수적 인 발전을 목표로 삼았습니다. 이러한 진화는 라이브러리 API의 진화에 대한 응답으로 클라이언트 코드에 필요한 변경 사항을 포함하며 함수 이름 바꾸기, 값에 어쨌든 문맥 의존적 인 함수 인수 추가 및 데이터 구조 재구성과 같은 수정을 포함 할 수 있습니다. 부수적 인 발전을 넘어, Coccinelle은 시스템 코드에서 버그를 찾고 수정하는 데 (우리와 다른 사람들에 의해) 성공적으로 사용되었습니다.

    +0

    +1 : 도구 만 있으면 아주 잘 알고 있습니다. – LB40