다음 코드를 고려C++ 함수 호출 식별자
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
LOG_ERROR()
매크로이다. LOG_ERROR()
은 코드를 식별하는 문자열을 인쇄해야하지만 코드는 변경 될 수 있지만 A::Foo()
은 변경되지 않습니다. 코드 이 변경되는 동안 식별자는 유지되어야합니다.
이
은LOG_ERROR()
, 에 인수로 추가 오류 코드에 의해 해결 될 수 있지만, 우리는 오류를 코드를 관리하는 부담 프로그래머에서 제거하려는.
__LINE__
을 사용하면 Foo()
이 (가) 빌드로 이동할 수 있기 때문에 답변이 아닙니다.
그러므로 나는 Foo()
시작으로 LOG_ERROR()
상대를 식별 생각 :
- 을 수행합니다. 파일 이름 (
__FILE__
) + 함수 이름 (__FUNCTION__
) +LOG_ERROR()
의 줄 번호를Foo()
시작과 비교하여 식별하십시오. - b. 파일 이름 (
__FILE__
) + 함수 이름 (__FUNCTION__
) +LOG_ERROR()
의 호출 번호는Foo()
입니다.
해결책은 최소한 VC++ 2008 및 g ++ 4.1.1에서 작동해야합니다.
한 제안 된 솔루션 (link text)입니다 :
#define ENABLE_LOG_ERROR static const int LOG_ERROR_start_line = __LINE__
#define LOG_ERROR(s) cerr << "error #" << (__LINE__ - LOG_ERROR_start_line) \
<< " in " << __func__ << ": " << s << endl
void Foo() {
ENABLE_LOG_ERROR;
//...
LOG_ERROR("error 1");
int i;
LOG_ERROR("error 2");
}
이 LOG_ERROR()
많은 같은 기능이있어 포함하는 각 기능의 시작에 ENABLE_LOG_ERROR
를 작성하는 사용자를 강제로.
다른 방법으로 작업을 수행 할 수 있습니까?
@idimba 너무 많은 문제가 없다면 스크립트를 사용하여 모든 함수 이름 바로 뒤에 자동으로 'ENABLE_LOG_ERROR;'를 추가 할 수 있습니다. 그 트릭을 * 타사 코드를 탐색 할 때 사용합니다. –
좋은 생각이지만, 우리가 로깅 서브 서멀에서 광범위하게 사용하는 __LINE__에 영향을 줄 것입니다. – dimba