2012-08-10 1 views
0

저는 프로그램을 작성 중이며 다양한 매크로 변수의 값에 따라 다양한 유형의 디버깅 정보를 출력하고 싶습니다. 그런 다음 화면에 다른 레벨의 정보가 기록됩니다). 예를 들어매크로를 사용하여 C++에 디버깅 문을 포함하는 방법

, 내 프로그램에 대한 화면에 정보를 인쇄 다음과 같은 코드가 있다고 가정 (이 D1 전화) :

cout << "% Percentage complete: " 
    << ceil((static_cast<double>(idx)/static_cast<double>(ITERATIONS))*(100.00)) 
    << "%" << endl; 
cout << "x = [ x; "; 
for(int i=0; i<space.getDimension(); i++) 
    cout << visited.vec[visited.bestIndex].x[i] << "\t"; 
cout << "];" << endl; 

를 이제 또한 내가 다른 정보를 인쇄 다음과 같은 코드가 있다고 가정 내 프로그램에 대한 화면에 (이 D2를 전화) :

cout << "best = [ best; " 
    << visited.vec[visited.bestIndex].meanQALY() << "];\n" << endl; 
space.displayConstraintsMATLAB(idx+1); 

나는 그런 #D1가 AS 문을 삽입 할 수 있도록하고 싶습니다 d #D2을 내 코드의 특정 위치에두고 매크로 프로세서에서 이러한 문을 위의 코드 블록으로 바꿉니다.

어떻게하면됩니까?

(매크로 이상적인 솔루션하지 않으면 내가이 일을 다른 방법에 대한 제안을 듣고 행복 해요.)

+0

'#define FOO','#ifdef FOO * codeblock * #endif'와 같은 뜻입니까? –

+0

@DennisMeng 예, 그렇습니다. 그리고 (그러나) 코드를 읽을 때 디버그 관련 코드 블록을 계속 살펴보고 싶지는 않습니다. 디버그 관련 코드가있는 부분을보고 싶습니다. – synaptik

+0

글쎄, 커다란'#define'을 할 수는 있었지만, 그게 틀린 것 같아서 ... –

답변

1

당신이 찾고있는 것은 로깅 기능입니다. 이 스레드를 some suggestions에 대해 확인하십시오.

왜 매크로 대신 전체 프레임 워크를 사용합니까?

문제는 적절한 로깅이 보이는 것보다 어렵다는 것입니다. 스레딩 문제, 세션, 클래스 및 객체 인스턴스가 고려해야 할 요소입니다. 또한 로그 파일 버퍼링, 롤오버 및 압축 로그 파일은 고려해야 할 문제입니다. 또한 네트워크 나 syslog (또는 둘 다) 또는 데이터베이스에 로그온 할 수 있습니다. 이 모든 것을 올바르게 구현하는 것은 많은 작업입니다.

매크로가 좋습니까?

확실! 우리 프로젝트에서 로깅 프레임 워크 (우리는 log4cpp을 사용하고 있습니다)에 호출을 래핑하는 LOG라는 단일 매크로를 정의했습니다.언젠가 장치를 다른 프레임 워크로 옮기려면 전체 코드베이스를 빗질하는 대신 한 곳에서 LOG 매크로를 재정의해야합니다. 이는 대부분의 로깅 프레임 워크가 일반적으로 로그 수준과 메시지 문자열로 구성된 유사한 인터페이스를 공유하기 때문에 작동합니다.

1

당신은 당신을 위해 디버깅을 수행하는 매크로를 만들 수 있습니다 - 같은 :

#ifdef D1 
# define DEBUG(var) //Debug 1 print implementation here 
#elif defined D2 
# define DEBUG(var) //Debug 2 print implementation here 
#else 
# define DEBUG(var) //No-op 
#endif 

그렇지 않으면 디버그 기능을 만들 수 있습니다. 그런 다음 해당 함수 내부에서 #if def 문과 비슷한 검사를 수행하여 입력 처리 방법을 확인하십시오. 함수 버전에는 조기 유형 감지 기능이 있으므로 처리 할 수없는 (일부 사용자 정의 객체) 것을 인쇄 할 때 오류에 대해 알려주는 경향이 있습니다. 또한 함수가 no-op (Release 모드에서 내부가 없음) 인 경우 최적화 플래그가있는 경우 컴파일러에서 함수 호출을 삭제하므로 릴리스 모드에서 추가 비용을 지불하지 않습니다. 디버그 호출.

내 자신의 디버그 호출에 대해 나는 보통 std :: cout과 같은 스트림 연산자를 정의하여 모든 입력을 문자열이나 char *로 변환 한 다음 DEBUG가 정의되거나 아무 것도 인쇄하지 않으면 디버그 함수로 펀트합니다. 예외 및 로깅의 경우 다양한 수준의 심각도 (정보, 경고, 오류 등)로 비슷한 측정 항목을 수행 할 수 있습니다. 이것은 디버깅 코드를 C++로 던지기가 쉬워지는 경향이 있습니다. 더 현대적인 언어입니다.

+0

둘 다 사용하는 것이 좋습니다, 함수는 좋은 형식 검사를 제공하는 반면 매크로를 만드는 동안 릴리스 모드에서 빌드 할 때 디버그 코드는 ' 프로그램 속도를 늦추십시오. #ifdef DEBUG #define LOG (r) #else #define LOG (r)/* nothing */#endif –

+0

@EvanDark 미안하지만 분명하지 않다면 두 번째 제안은 정확히 그 것이었다. #ifdef 검사로 구현 된 내부 프로토 타입. no-op로 설정하면 opt 플래그로 최적화됩니다. 나는 그것을 명확하게하기 위해 대답을 업데이트 할 것이다. – Pyrce

관련 문제