에 대한 코드가 있으면 log_out()다시 작성하십시오. 대부분 다음을 수행 할 수 있습니다.
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
추가 로깅 정보가 필요한 경우 표시되는 메시지 전후에 인쇄 할 수 있습니다. 이렇게하면 메모리 할당 및 모호한 버퍼 크기 등이 절약됩니다. 아마도 logfp0 (널 포인터) 으로 초기화 하고 그것이 널인지 확인하고 적절하게 로그 파일을 열어야 할 log_out()필요가 있습니다. 그러나 기존의 코드는 어쨌든 그것을 처리해야합니다.
이 솔루션의 장점은 마치 변형 된 것처럼 간단히 호출 할 수 있다는 것입니다 printf(). 실제로 printf().
에 대한 코드가없는 경우 log_out()위에 설명 된 것과 같은 변형으로 대체 할 수 있는지 고려하십시오. 동일한 이름을 사용할 수 있는지 여부는 애플리케이션 프레임 워크와 현재 log_out()함수 의 궁극적 인 소스에 따라 다릅니다 . 다른 필수 기능과 동일한 개체 파일에있는 경우 새 이름을 사용해야합니다. 정확히 복제하는 방법을 찾을 수 없다면 적절한 양의 메모리를 할당하는 다른 답변에 제공된 것과 같은 변형을 사용해야합니다.
void log_out_wrapper(const char *fmt, ...)
{
va_list args;
size_t len;
char *space;
va_start(args, fmt);
len = vsnprintf(0, 0, fmt, args);
va_end(args);
if ((space = malloc(len + 1)) != 0)
{
va_start(args, fmt);
vsnprintf(space, len+1, fmt, args);
va_end(args);
log_out(space);
free(space);
}
/* else - what to do if memory allocation fails? */
}
당연히 log_out_wrapper()대신에 log_out()-를 호출 하지만 메모리 할당 등은 한 번 수행됩니다. 나는 하나의 불필요한 바이트만큼 공간을 초과 할당 할 권리를 보유합니다. 반환 된 길이 vsnprintf()에 종료 널이 포함 되는지 여부를 다시 확인 하지 않았습니다.