2011-01-30 8 views
3

작업중인 프로젝트의 로그 파일 시스템에 약간의 기능을 추가하고 싶습니다. 내 LogError() 호출에 대해 오류가 발생한 함수를 포함하고 싶습니다. LogError()이라는 함수의 이름에 액세스 할 수있는 방법이 있는지 궁금해서 프로그래밍 방식으로 해당 정보에 액세스하여 로그에 추가 할 수 있습니다. .프로그래밍 방식으로 호출하는 함수의 이름에 액세스 할 수 있습니까?

위의 예에서
bool Engine::GraphicsManager::Initialize(const HWND i_hWindow_main) 
{ 
    if (!InitializeWindow(i_hWindow_main)) 
    { 
     Engine::LogManager::Instance().LogError(L"GraphicsManager::Initialize - Unable to initialize graphics window"); 
     return false; 
    } 
    Engine::LogManager::Instance().LogMessage(L"Graphics window initialized successfully"); 

    /* SNIP */ 

    initialized = true; 
    return true; 
} 

, 나는 (적어도 일부) 그 함수의 이름 대신의 퍼팅이 GraphicsManager::Initialize() 출력에서 ​​호출 된 것으로 판단 할 수 LogError() 싶습니다 : 예를 들어

손으로 도처에.

편집 : vfwprintf_s()는 그래서 그들은 가변 길이 인수 목록을 취할 수에 대한 내 LogError() 기능 (다른 로깅 기능) 본질적으로 언급해야 래퍼. "매크로 사용"을 좋아하지만 잠재적 인 문제 (다른 질문 일 가능성이 있음)를 해결하는 방법을 모르겠습니다.

여전히이 /가 능니까?

감사합니다. 일부 수정이 와이드 문자

//support macros 
#define WIDEN2(x) L ## x 
#define WIDEN(x) WIDEN2(x) 
#define STRINGIZE(x) #x 
#define __WFILE__ WIDEN(__FILE__) 
#define __WFUNCTION__ WIDEN(__FUNCTION__) 
#define __WLINE__ WIDEN(STRINGIZE(__LINE__)) 
// logging macro 
#define LOG(msg) Engine::LogManager::Instance().LogError(__WFILE__ L"::" __WFUNCTION__ L":" __WLINE__ L" - " msg) 

이는 방식으로 작동이

if(error) { LOG(L"Error!"); } 

로그

File.cpp::Function:Line - Error! 

처럼 사용 다루는 :

답변

4

당신은 함수 이름에 대한 인수를 추가하고, 매크로 __FUNCTION__에 전달할 수 : http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.80%29.aspx

그리고 당신은 자동으로 ...log...(__FUNCTION__)...log...()을 대체 할 매크로를 정의 할 수 있습니다.

+0

내가 가변 길이 인수 목록을 처리 할 필요가 말을 내 원래의 게시물 업데이트 . 더 복잡한 작업을 위해 매크로를 사용하는 것에 익숙하지 않습니다. 추가 경고가 있으면이 작업을 수행 할 수 있습니까? – chaosTechnician

+0

@chaosTechnician : 아무 것도 놓치지 않았다면 형식 인수 앞에 함수 이름 인수를 전달하면됩니다. 개인적으로 메시지 인수뿐만 아니라 유용한 정보 (줄 번호, 파일 이름)의 각 비트에 대한 인수를 전달합니다.로깅은 모든 것을 포맷팅합니다. –

0

는 로깅 매크로

편집합니다 미국 C 스타일 문자열 연결. "aa" "bb"-> "aabb"와 함께 L을 입력하여 "astring" 앞에 붙여 넣으십시오. __FILE__, __FUNCTION__ 및 __LINE__ 매크로를 사용하여 오류가 기록 된 위치를보고합니다. __LINE__은 STRINGIZE 매크로가있는 문자열로 변환됩니다. 표준을 엉터리로 준수하기 때문에 어쨌든 부스트를 사용하려는 경우 BOOST_PP_STRINGIZE을 권장합니다.

1

이 사용할 수있는 사전 정의 된 매크로와 C/C++ 표준의 일부입니다 :

__FILE__ __LINE__ 

그들은 here을 설명은

관련 문제