2011-08-11 5 views
1

우리 C/C++ 프로젝트는 SWIG의 모든 기능을 자유롭게 파이썬 스크립트에서 사용할 수 있도록 새로운 내부 스크립트를 사용하고 있습니다. SWIG는 가변 함수를 잘 감쌀 수 없으므로 로거 함수를 질식시킵니다.가변적 인 printf 스타일의 로거

#include <iostream> 

void LogPrint(char *file, int line, char* msg) 
{ 
    std::cout << file << ":" << line; 
    std::cout << " [ " << msg << " ] "; 
    std::cout << std::endl; 
} 

#define MAX_LOG 256 

#define LogPrintf(msg, args...) \ 
{ \ 
    char *msg_buffer = new char[MAX_LOG]; \ 
    snprintf(msg_buffer, MAX_LOG, msg, ##args); \ 
    Log(__FILE__, __LINE__, msg_buffer); \ 
    delete [] msg_buffer; \ 
} 

main() 
{ 
    LogPrintf("%s = %f", "tau", 6.28318); 
    LogPrintf("%s = %f", "pi", 3.14159); 
} 

이 괜찮 :

그래서 나는 아래의 간단한 예와 같이, 꿀꺽 꿀꺽가 걸려 넘어하지 않습니다 매크로의 가변 기능을 숨기기로 결정? 이 문제에 대한 더 나은 해결책이 있습니까? 감사.

+0

C/C++와 같은 것은 없으며 둘 다 가변 매크로에 대해 실제로 다릅니다. 귀하의 코드는 C++이지만 C로 질문에 태그를 달았습니다. 하나를 선택하거나 찾고있는 것을 더 잘 설명하십시오. –

답변

2

파이썬은 파이썬 내에서 형식화 된 문자열을 어셈블하는 것을 쉽지 않으므로 간단한 "나에게 문자열을주고 로그에 남김"오류 만 제공합니다.

일반적인 경우를 들어,하지만 당신은 고려해 볼 수 있습니다 :

1) 부스트 :: 형식

2)에 전달 operator<<를 오버로드하는 std::stringstream 회원을 보유하고 클래스를 생성하여 iostream 인터페이스를 모방 stringstream의 operator<<을 추가 한 다음 실제로 "버퍼"내용을 기록하는 다른 방법을 추가하십시오 (한 가지 방법은 객체의 소멸자에 로그인하는 것입니다 - 복사 할 수 없게 만드는 것이 좋습니다) - Logger() << "foo" << bar;과 같은 작업을 수행 할 수 있습니다. 임시 객체 수명이 라인의 끝까지 확장되고, 연산자 오버로드가 버퍼 내용을 구축합니다. , 그리고 나서 dtor가 실행되어 stringstream의 .str()을 아무 곳에 나 출력합니다).

+0

다른 옵션을 이용해 주셔서 감사합니다. 좋은 생각. –