2010-07-30 3 views
17

다른 함수에서 가변 인수 (...) 또는 va_list이 전달되는 함수가 있다고 가정합니다. 주요 논리는이 함수 자체에 있습니다 (f1이라고 부름).하지만 다음 인수 유형을 결정하고 va_arg을 사용하여 얻은 다음 다른 함수 (f2이라고 부름)에 va_list을 전달하고 올바르게 변환하고 호출자가 사용할 수 있도록 저장하십시오.va_list 또는 va_list에 대한 포인터를 전달 하시겠습니까?

va_list를 f2으로 전달하는 것으로 충분하거나 va_list에 대한 포인터를 전달해야합니다. va_list가 배열 유형이어야하거나 객체 위치가 객체 자체가 아닌 포인터를 가리키는 위치에 저장되어 있지 않으면 호출 함수 (f1)를 허용하는 값으로 전달하는 방법을 볼 수 없습니다. va_arg에 의해 호출 된 함수의 변경 사항을 '확인'합니다.

누구든지이 문제에 관해 밝힐 수 있습니까? 나는 표준이 요구하는 것에 관심이 있으며, 어떤 특정한 구현이 허용하는 것이 아니다.

답변

23

va_list에 대한 포인터를 전달해야 할 것 같습니다. 더 많은 정보, 특히, 글 머리 3 개 상태 7.15.In C99 standard document 절 참조 : 오브젝트 AP는 다른 함수의 인수로서 전달 될 수있다

; 그 함수 파라미터 AP와 va_arg를 매크로를 호출하는 경우, 호출하는 함수의 AP의 불확정이고 va_end의에 매크로 AP에 대한 상기 기준 이전

[내 이탤릭체]을 통과하여야

편집 :

215)이의 va_list 포인터를 만들고 해당 포인터를 전달하는 것이 허용된다 그냥 표준에 각주를 발견 원래의 함수가 다른 함수 뒤에 원래 목록의 추가 사용을 할 수있는 경우 또 다른 기능은

그래서 당신이의 va_list 포인터를 전달하고 호출 된 함수에서 va_arg(*va_list_pointer)을 수행 할 수 있습니다 반환합니다.

+0

마지막 편집에 동의합니다 - 포인터가 갈 방법입니다 (OP는'va_list '에 대한 변경 사항을 호출 함수에서 확실히 볼 수 있기를 원하기 때문입니다). – caf

+0

@caf : 다른 사람들이 내가했던 것처럼 똑같은 실수를하는 것처럼 보였고 기존의 프로토 타입을 질문자에게 제안하는 것처럼 보이기 때문에'vfprintf()'에 대한 내 참조를 편집해서는 안된다고 생각합니다. 그의 질문에 대답한다.) – JeremyP

+2

나는 의견을 남기고/또는 투표를 끝내라고 말하고 싶습니다. 이전의 부정확 한 가정에 대해 정확한 대답을하는 것이 더 낫습니다. – caf

2

제 생각에는 va_list를 직접 전달해야합니다 (포인터가 아닙니다). . 그것은 하나 정말 종류의 포인터이다 즉,의 va_list를 받아들이는 기능 자체가 가변 인자 아니며, 그;

"A의 va_list는 그 자체 변수 인수 목록은 다음과 같습니다이 comp.lang.c에 의해 지원 될 것으로 보인다 그 반대입니다. "

+0

견적이 귀하의 주장을지지한다고 생각하지 않습니다. 'va_list '에 포인터를 넘기는 것은 허용되지 않으며, 실제로이 표준은 이것을 허용한다고 명시하고 있습니다. – caf

2

나는이 질문에 텍스트가 아주 모호하다는 것을 알게된다. 가장 간단한 방법은 아마도 va_list 인 미리 정의 된 함수가 어떻게 받아 들여 지는지를 표준에서 살펴 보는 것입니다 (예 : vsnprintf). 그리고 이것은 분명히 참고가 아닌 가치에 의한 것입니다.표준 C 라이브러리 패스 va_list 요소 자체에

+1

표준 기능은 OP가 필요하다 - 호출 된 후에,'va_list'는 더 이상 사용할 수 없으며 오직'va_end()'로 전달되어야합니다. – caf

+0

사실, 나는 OP이고 나는 이것에 caf에 동의한다. JeremyP는 어떤 증거도 인용 한 것으로 보이는 유일한 사람이며, 내가 원하는 의미에 대한 포인터를 전달해야한다는 표준이 매우 분명합니다. –

0

기능 (man 3 vprintf) :

#include <stdarg.h> 

    int vprintf(const char *format, va_list ap); 
    int vfprintf(FILE *stream, const char *format, va_list ap); 
    int vsprintf(char *str, const char *format, va_list ap); 
    int vsnprintf(char *str, size_t size, const char *format, va_list ap); 
+1

이 함수들은 OP가 원하는 방식으로 호출되지 않습니다.이 함수들이 호출 된 후에 더 이상'va_list'를 사용할 수없고'va_end()'만 전달해야합니다. – caf

0

의 va_list 포인터를 전달은 32 비트 시스템에서 잘 작동합니다. 서브 루틴에서 한 번에 하나의 매개 변수를 가져올 수도 있습니다. 하지만 64 비트 시스템에서는 작동하지 않는 것 같습니다. va_arg()에서 세그먼트 오류가 생성됩니다.

관련 문제