我在C中写了一个函数,它带有可变数量的参数。C可变参数-Va_copy问题
size_t myprintf(char *fmt, ...);
到目前为止,这么好。我决定最好是以正确方式做事情,并制作一个采用可变参数的版本,而另一个版本则采用va_list
。
size_t myprintf(char *fmt, ...);
size_t myvprintf(char *fmt, va_list args);
没那么难。除了my_vprintf()
需要发送其args
出两个不同的功能(首先到snprintf()
长度为0,以确定我们需要多少空间,然后到sprintf()
后,我们已经分配了这么多的空间)。我用va_copy
这样做。
size_t myvprintf(char *fmt, va_list args)
{
va_list args2;
va_copy(args, args2);
// do stuff with args2
va_end(args2);
// do more stuff with args
}
这是所有罚款和花花公子,但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
,使两个单独的副本等 - 但我不知道他们将如何工作(和递归解决方案赢得'如果我只想打电话给vsnprintf()
,那么现在呢?)。
所以我转向你,StackOverflow用户。有没有更多的事情可以做,以提供C89的兼容性,或者是没有va_copy
和__va_copy
(承认很少和很远)的用户将不得不把它吸入并采取它?
这是2009年。为什么你仍然需要C89的兼容性? – stepancheg 2009-08-11 09:26:53
因为VC++没有(也可能不会)支持它。我喜欢拥有它。我认为这是一件好事。 – 2009-08-11 09:35:05
我认为MS实际上已经有记录表明他们没有打算去购买C99,除了挑选客户想要的奇特功能。 – KTC 2009-08-11 09:50:03