2014-11-03 1 views
0

c++ 함수에서 printf를 래퍼하는 것이 좋습니다. 파이썬에 이 있습니다. s 및 lStringFormat을 사용하여 PyArg_ParseTuple에 형식 문자열을 전달합니다. 그러나 다른 가치를 어떻게 전달할 수 있습니까? 나는 그것을 받기 전에 그들을 모른다.어떻게 파이퍼에서 printf C++ 함수를 래핑 할 수 있습니까?

예를 들어 내가 ....

int years = 30 
printfPy("I am %d old", years) 

래퍼는 다음과 같이

static PyObject* PrintfPy(PyObject *self, PyObject *args) 
{ 
    char* lStringFormat; 

    if (!PyArg_ParseTuple(args, "s...", &lStringFormat, ...)) 
     return NULL; 

    sprintf(lStringFormat, ...); 

} 

나에게 어떤 제안을 작성합니다?

감사합니다.

답변

1

튜플을 포함하는 PyObject 또는 기타 일반 데이터 구조체를 printf 또는 vprintf 또는 유사한 함수에 적합한 가변 길이 인수 목록으로 이식 가능하게 변환 할 수 없습니다. 특히 printfPy와 같은 변수가 아닌 인수 함수를 가변 인수 함수의 일반 래퍼로 변환 할 수 없습니다. 동적으로 결정된 유형의 인수를 동적으로 결정된 수와 함께 printf과 같은 함수로 호출하려면 함수의 인수 목록에 ...이 있거나 형식이 va_list 인 객체를 보유해야합니다. 일부 함수의 인수 목록에있는 ...에서만 구성 할 수 있습니다. (하나는 그러한 vprintf으로,하지만 기능의 v... 가족 중 하나를 호출 할 수 있지만, 하나는 여전히 함수 인수 목록에서 ...에서 시작해야합니다. 전혀 자신이 방법을 printf를 호출 할 수 없습니다.)

합리적으로 (그러나 보편적으로는 아니지만) 이식 가능한 솔루션에는 libffi와 같은 써드 파티 라이브러리가 필요합니다. 아마도 초보자에게는 쉽지 않을 것입니다.

질문은 C++로 표시되어 있으므로 C++에서 C 스타일의 가변 길이 함수 인수 목록을 거의 완벽하게 피할 수 있습니다. 이러한 함수가 지원해야하는 타사 라이브러리에있는 경우는 예외입니다. C++ 대안을 사용하여 printf 및 friends를 작성하고 가변 길이 인수 목록 대신 표준 컨테이너를 허용하는 자체 함수를 작성하십시오.

+0

Upvote 저는 오늘 새로운 것을 배웠습니다. – Anzel

관련 문제