2016-11-30 1 views
3

큰 프로젝트 (C)에서 코드 조각을 잘라 냈습니다. 이 코드에는 많은 곳에서 많은 매크로가 정의되어 있습니다. 그 중 일부는 원래의 더 큰 코드베이스에서만 사용되며 잘라낸 코드 부분에서는 사용되지 않습니다.내 코드에서 사용하는 매크로를 빠르게 결정하는 방법은 무엇입니까?

실제 사용중인 매크로와 사용하지 않는 매크로를 신속하게 확인하고 싶습니다. 그렇지 않은 매크로를 신속하게 제거하고 싶습니다. 나는 그것들을 사용하는 코드 경로가 받아 들여지는지 여부에 상관하지 않는다. (즉, if (1+1 == 3) { MY_MACRO(a,b,c); }은 내가 염려하는 한 사용이다.)

가장 좋은 방법은 전처리이다. . -E와 모든 어떻게 든 매크로를 언급 소스 위치 주석을 찾아

참고 :. 당신은 또한 사용의 기능을 나열하는 솔루션이있는 경우

  • , 괜찮아요 너무
  • 있어 나는 오직 특정 기능을 직접 호출한다. 코드를 프로젝트에서 잘라냅니다. 솔루션은 많은 실제로 엔트리 포인트에서 호출되는 기능하는 사람들에게 나열된 매크로를 제한 할 수있는 경우에, 그것은 더 나은입니다
  • 내 코드를 컴파일하고 그냥 주석
  • 실행 (즉, 도움이된다면 당신은 출력을 gprof의 가정 할 수 있습니다) 명백히 실현 가능한 모든 매크로를 처리하는 것은 번거롭다. 그래서 나는 그것을 할 필요가없는 해결책을 원합니다.
  • 전 처리기에서 제외 된 코드는 사용되지 않습니다. 하지만이 제한을 준수하지 않는 솔루션을 사용하면 아무 것도없는 것보다 나은 것입니다.
  • 나는 "dump the list of preprocessor defines"을 원하지 않지만, 사용중인 을 정의합니다..
+4

모든'# define' 지시어를 주석 처리하고 다시 작성하십시오. 어떤 기호가 불평하는지 확인하십시오. –

+2

Sidenote : 코드가 컴파일되므로 매크로 제거 전과 후에 바이너리를 비교해야합니다. 조건부 컴파일에 사용되는 매크로를 실수로 제거 할 수 있으며 경고 또는 오류가 표시되지 않습니다. – user694733

+0

@Someprogrammerdude : 편집을 참조하십시오. 나는 그것보다 게으르고 싶다. – einpoklum

답변

3

clangpp-trace이라는 도구가 있습니다. 매개 변수와 함께 모든 선행 처리기 호출을 출력합니다.

... 

- Callback: MacroExpands 
    MacroNameTok: X_IMPL 
    MacroDirective: MD_Define 
    Range: [(nonfile), (nonfile)] 
    Args: [a <plus> y, b] 

... 

당신을 위해 트릭을 할해야 MacroExpands 블록에서 MacroNameTok 추출 : 그래서 pp-trace 출력처럼 당신은 MacroExpands 이벤트에 관심이

, 그것은 보인다.

+0

deniss는 clang-3.8에서 사용 가능합니까? 쿠분투 16.04 배포판에서 찾는데 문제가 있습니다. – einpoklum

+0

@einpoklum, 있어야합니다. 불행히도, 나는 소스로부터 만 빌드 했으므로 바이너리로 재배포 될지 확실하지 않습니다. – deniss

+0

음, 그냥 알기 바란다. [buntu 16.04에서 빠졌으며 아무도 그 이유를 모른다.] (http://askubuntu.com/posts/comments/1319419?noredirect=1). – einpoklum

관련 문제