2011-09-19 3 views
15

관리자와의 최근 토론에서 이전 고객 중 한 명이 C++ 매크로를 사용하여 모든 코드 줄에 대한 정보를 기록한다고 언급했습니다. 실행을 시작하기 전에 환경 변수를 사용할 수 있어야했습니다. (물론 환경 변수는 단독으로 테스트 베드에서 활성화 된모든 코드 줄을 기록하는 C++ 매크로

로그가 너무 사용 된 변수와 해당 값을 언급 한 예를 들어 라인에 대해 :..

a = a + b; 

에게 로그 말 것 뭔가 같은이 가능했지만, 그는 코드의 세부 사항을 기억하지 않았지만 그가 존재하는 데이 매우 확신했다 경우

"a = a + b; (a = 5 + 3)" 

개인적으로, 나는 확실하지 않았다

.

그래서, 여기에 (명백한) 질문이 있습니다 : 가능합니까? 이 코드를 제공 할 수 있습니까?

+0

, 나는 로그 메시지에 대한 따옴표를 포장하고 (이 로그 메시지의 것을 보여주기 위해). 희망은 그것이 좋다. – iammilind

+0

C++ 매크로 같은 것은 존재하지 않으며 바닐라 C 전 처리기 매크로에서는 이것이 가능하지 않습니다. 다른 도구는 값 문자열을 생성해야합니다. – spraff

+1

"a = a + b"와 같이 맨줄을 기록 할 수는 없지만 "LOG (a = a + b)"와 같은 줄에 매크로를 사용하는 것이 가능하며 매크로가 이미 매크로를 수행하고 있습니다. – Dialecticus

답변

18

모든 라인/변수를 이와 같이 확장 할 수 있는지는 모르겠지만 함수 호출을 기록 할 수는 있습니다. gcc의 -finstrument-functions 옵션을 사용하여 모든 함수 호출을 기록했습니다. 그것은 호출 : 함수에 대한

void __cyg_profile_func_enter (void *this_fn, void *call_site); 

void __cyg_profile_func_exit (void *this_fn, void *call_site); 

입력하고 종료합니다.

The docs explain how to use it. 다른 컴파일러가 비슷한 것을 제공하는지 잘 모르겠습니다.

+2

+1 흥미로운 찾기 – trojanfoe

+1

MSVC++는'_penter()'에'/ Gh'와'/ GH'를 가지고있다. 및'_pexit()'함수를 호출합니다.이 함수는 각 함수의 처음과 끝에 각각 호출됩니다. http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx –

0

BOOST_CHECKA from Boost.Test is implemented을 확인하실 수 있습니다. 내부적으로 표현 템플릿을 사용합니다. 시험용

:

#define BOOST_TEST_MAIN 

#include <boost/test/included/unit_test.hpp> 
#include <boost/test/test_tools.hpp> 

BOOST_AUTO_TEST_CASE(test1) 
{ 
    int a=0; 
    int b=1; 
    int c=2; 
    BOOST_CHECKA(a+b == c); 
} 

출력된다 : 대괄호

Running 1 test case... 
main.cpp(11): error: in "test1": check a+b == c failed [0+1!=2] 

*** 1 failure detected in test suite "Master Test Suite" 

참고 값 : [! 0 + 1 = 2]

이것은 몇 가지 제한을 갖는다. 시험에 대한

:

BOOST_CHECKA((a+b) == c); 

출력은 다음과 같습니다

질문에
check (a+b) == c failed [1!=2]