2008-09-19 2 views
13

일반적으로 정의에 몇 가지 전 처리기 조건부 요소가있는 중첩 매크로 체인이 있습니다. 실행중인 실제 코드를 직접 보는 것이 어렵 기 때문에 디버깅하는 것이 어려울 수 있습니다.C++ 매크로를 디버깅하는 일반적인 방법이 있습니까?

얼마 전에 컴파일러 (gcc) 플래그를 확장하여 찾는 것을 막연하게 기억했지만 실제로이 작업을 수행하는 데 어려움이있었습니다.

+0

내용에 따라 –

답변

14

gcc -E는 전처리 된 소스를 stdout으로 출력합니다.

1

로드 된 기호로 해체를 디버그하십시오.

8

MSVC 사용자의 경우 파일/프로젝트를 마우스 오른쪽 버튼으로 클릭하고 설정을보고 파일 속성을 변경하여 전처리 된 소스 (일반적으로 obj 디렉토리에 있음)를 출력 할 수 있습니다.

+0

을 기반으로 한 gcc 태그가 지정되어 있습니다.하지만 팁이 필요합니다.하지만 처리 된 파일은 매크로를 직접 사용하는 것보다 나쁩니다 (특히 매크로가 여러 줄에 걸쳐있는 경우). 문서의 대부분을 채우는 많은 빈 줄이있는 어떤 이유로 긴 수십만 줄. – Samaursa

5

이것은 상황에 따라 다를 수 있지만 매크로는 실제로 디버깅을 방해하고 종종 과도하게 사용되고 피할 수 있습니다.

인라인 함수로 바꾸거나 그렇지 않으면 함께 제거 할 수 있습니까?

+1

감사합니다. 좋은 조언. 나는 특정한 상황 때문에가 아니라 과거에 이것으로 문제가 있었고 미래에 더 많은 것을 예상했기 때문에 묻고있었습니다. 내가 유지 관리하는 코드의 대부분 (주로 저에게 쓰여지지는 않음)은 매크로를 광범위하게 사용하기 때문에 디버깅 할 수있는 것이 유용합니다. – Tyler

+1

저는 유감스럽게도 유감스럽게도 많은 사람들이이 정보를 알 필요가 있습니다. 왜냐하면 우리는 게으르고 무능한 사람들이 사용하는 디버깅 매크로가 남아 있거나 매크로를 자주 사용하는 것이 "좋은 디자인"이라고 생각하기 때문입니다. – weberc2

2

양식 매크로를 멀리 이동하고 인라인 및 템플릿 사용을 시작해야합니다.

매크로는 때로는 올바른 도구이며 올바른 도구입니다. 마지막 수단으로 printf가 여러분의 친구라는 것을 기억하십시오 (실제로 printf는 다중 쓰레드를 할 때 그다지 좋지 않습니다)

0

GCC 및 호환 컴파일러는 -E 옵션을 사용하여 전처리 된 소스를 표준 출력으로 출력합니다.

gcc -E foo.cpp 

썬 스튜디오는 또한이 플래그를 지원합니다

CC -E foo.cpp 

그러나 더 나은이 -xdumpmacros입니다. 추가 정보를 찾을 수 있습니다. in Suns' docs.

1

gcc -save-temps 은 컴파일러에게 넘겨지기 전에 C 전처리 기의 출력 인 .i (또는 .iii C++ 파일)을 작성합니다. 이것은 종종 계몽적일 수 있습니다.

관련 문제