2011-04-23 4 views
3

TraceMessage은 가변 인수 개수를 갖는 WinAPI 함수입니다. 이 함수는 Windows 추적에서 추적 메시지를 생성하는 printf와 유사한 표기법과 함께 추적 기능입니다. 여기서 기이 한 부분은 전용 인수가 아닌 생략 부호의 일부로 형식 문자열을 수신한다는 것입니다. 이 함수를 내 자신의 함수로 '재정의'할 수 있습니다.이 함수는 TraceMessageVa (줄임표가 아닌 va_args와 같은 TraceMessage와 동일 함)을 호출해야합니다.줄임표 및 va_args 트릭이 필요합니다.

지금까지 그렇게 좋았습니다. 하지만 지금은 생략 된 형식 문자열이있는 sprintf과 같은 함수를 사용하여 추적 된 메시지에 액세스하려고합니다. 따라서 나는
- 줄임표에서 형식 문자열 인수를 가져와야합니다.
- 첫 번째 인수없이 새 va_list를 만듭니다.

어떻게 할 수 있습니까? Visual Studio 컴파일러 관련 솔루션도 사용할 수 있습니다. 감사!

+1

TraceMessage 용 문서는 사용자가 말하는대로 말하는 것은 아닙니다. –

+0

맞습니다. 그러나 당신은 저를 믿어 주셔야합니다. 또는 이것을 추적 컨텍스트에 관계없이 줄임표와 va_args에 관한 질문으로 취급해야합니다 ... –

답변

4

va_list을 사용하면 이미 va_arg을 사용하여 하나 이상의 인수를 추출한 후 va_list을 사용하는 함수로 전달할 수 있습니다. 그러면 va_list은 나머지 인수 만 "포함"하는 것처럼 작동합니다.

나는 TraceMessage과 관련하여 경험이 없지만 표준 vprintf과 테스트 기능을 사용하는 예를 제시했습니다. 적절하게 적응할 수 있어야합니다.

예.

#include <stdio.h> 
#include <stdarg.h> 

void test(int a, ...) 
{ 
    va_list va; 
    const char* x; 

    va_start(va, a); 
    x = va_arg(va, const char*); 

    vprintf(x, va); 

    va_end(va); 
} 

int main(void) 
{ 
    test(5, "%d\n", 6); 
    return 0; 
}