2009-08-11 4 views
6

가변 개수의 인수를 사용하는 C 함수를 작성하고 있습니다.C varargs - va_copy 문제

size_t myprintf(char *fmt, ...); 

지금까지는 그렇게 좋았습니다. Right Way ™를 사용하고 다양한 인수를 사용하는 버전을 만들고 va_list을 사용하는 다른 버전을 만드는 것이 가장 좋습니다.

size_t myprintf(char *fmt, ...); 
size_t myvprintf(char *fmt, va_list args); 

그리 어렵지 않습니다. my_vprintf()을 제외하고는 args을 2 개의 다른 기능으로 보내야합니다 (먼저 많은 방을 할당 한 후 길이가 0 인 snprintf()부터 sprintf()까지 할당해야 함). 나는 va_copy으로 이것을한다.

이것은 모두 훌륭하고 멋쟁이지만, C99는 약간 잘못 구현되었습니다. 가능하다면 C89에서도 제 코드가 작동하도록하고 가능한 한 많은 플랫폼과 많은 컴파일러로 작업하고 싶습니다. 나는 현재 #include <stddef.h> 후 이것을 가지고 있지만 코드 앞에 :

#ifndef va_copy 
# ifdef __va_copy 
# define va_copy(a,b) __va_copy(a,b) 
# else /* !__va_copy */ 
# define va_copy(a,b) ((a)=(b)) 
# endif /* __va_copy */ 
#endif /* va_copy */ 

나는 ((a)=(b))가 신뢰할 수, 나는 아마 memcpy() 또는 유사한 것을 사용한다고 믿게하고, 그러나 이것은 "당신이 만약의 수준에 여전히 C99을 지원하지 않는다면, 나는 그것이 "C99를지지하지 않는다면, 나는 결코 원하는 것이 아닌"두려워하지 않을 것이다. 이 한계를 극복하기위한 좋은 방법이 있습니까? 몇 가지 솔루션을 보았습니다 - va_list 함수는 하나의 인수를 사용하여 반복되고 va_list을 두 번 통과하여 두 개의 별도 복사본이 만들어 지도록합니다.하지만 어떻게 작동 할 것인지 잘 모릅니다 (재귀 적 솔루션은 ' 만약 내가 단지 vsnprintf()에 전화하고 싶다면 잘하니?).

그래서 내가 당신에게, StackOverflow 사용자. C89 호환성을 제공하기 위해 내가 할 수있는 것이 더 있습니까? 아니면 va_copy__va_copy이없는 사용자가 있습니까?

+0

2009 년입니다. C89 호환성이 필요한 이유는 무엇입니까? – stepancheg

+0

VC++은 이것을 지원하지 않기 때문에 (아마도 지원하지 않을 것입니다). 그리고 나는 그것을 가지고 싶어. 나는 그것이 좋은 물건이라고 생각합니다. –

+0

나는 MS가 레코드에서 실제로 C99로 갈 의사가 없다고 말하면서 실제로 멀리 갔다고 생각하는데, 고객이 원하는 이상한 기능을 선택하고 선택하는 것을 제외하고. – KTC

답변

3

(a)=(b)은 신뢰할 수 없습니다. 심지어의 va_list 뭔가처럼 될 수있는 (공공 기능은 간단한 래퍼 것) 2 개의 va_list을 통과 :

typedef __va_list_impl va_list[1]; 

어느 하나에 va_arg를 수행하는 다른 수정 될 것입니다 (I 솔라리스는 사용할 것을 기억하는 것 일종의, 아, 등록 창 ...). 슬프게도, 나는 당신이 원하는 것을 할 확실한 방법이 없다는 것을 압니다.

+0

나는 이것을 두려워했다. 오, 그럼.hack -'va_copy'를'#error '로 변경하는 것이 적절하다고 생각합니다. 새 컴파일러를 얻으십시오. " –

+0

이 특별한 경우에, 하나의 배열을 할당 할 수 없으므로 va_copy 매크로의 할당이 실패합니다 다른 사람에게. – caf

관련 문제