가변 개수의 인수를 사용하는 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
이없는 사용자가 있습니까?
2009 년입니다. C89 호환성이 필요한 이유는 무엇입니까? – stepancheg
VC++은 이것을 지원하지 않기 때문에 (아마도 지원하지 않을 것입니다). 그리고 나는 그것을 가지고 싶어. 나는 그것이 좋은 물건이라고 생각합니다. –
나는 MS가 레코드에서 실제로 C99로 갈 의사가 없다고 말하면서 실제로 멀리 갔다고 생각하는데, 고객이 원하는 이상한 기능을 선택하고 선택하는 것을 제외하고. – KTC