可变长度参数列表错误
Variable length argument list error
很多年前我写了一个自定义打印函数,声明如下:
void my_printf(char *format_string, ... )
{
// too complex to list here
}
我可以这样称呼它:
my_printf("Number of apples = %d\n",apple);
此功能一直运行良好。我现在希望制作一个包装函数,它在开始时采用一个额外的整数,如下所示:
void my_printf_extra(int extra,char *format_string, ...
)
可以这样称呼:
my_printf_extra(debug_level,"Number of apples = %d\n",apple);
我希望包装函数以如下方式调用原始函数:
void my_printf_extra(int extra,char *format_string, ... )
{
if (extra == some_test)
{
my_printf(** not quite sure what goes here **);
}
}
我的猜测是:
void my_printf_extra(int extra,char *format_string, ... )
{
va_list vptr;
if (extra == some_test)
{
va_start(vptr,format_string);
my_printf(format_string,vptr);
va_end(vptr);
}
}
但它不起作用。在我的最终输出中,我看到
Number of apples = -46467968
或一些这样的垃圾数字(当真实值为 1 时)。使用字符串调用 my_printf_extra 时,我看到了类似的垃圾。我怀疑我对 va_list 的处理是错误的,但我无法理解到底是怎么回事。
编辑: my_printf() 非常灵活,可以打印到各种不同的地方。有时它只是将文本附加到 rich-edit-control-window。这完全取决于各种标志以及正在打印的内容。
由于 my_printf
不期望 va_list
,您不能将其传递给它。
在这种情况下使用宏是有意义的:
#define my_printf_extra(extra, format_string, ... ) \
do {\
if ((extra) == some_test)\
{\
my_printf((format_string), __VA_ARGS__);\
}\
} while (0)
__VA_ARGS__
宏替换了所有额外的参数。请注意,这需要支持 C99 的编译器。
或者,您可以修改 my_printf 以添加额外的逻辑,将名称更改为内部名称,然后将 my_printf
和 my_printf_extra
定义为调用内部函数的宏:
void my_printf_impl(int extra, char *format_string, ... )
{
if (extra != some_test) {
return;
}
...
}
#define EXTRA_DEFAULT 0
#define my_printf(format_string, ...) \
my_printf_impl(EXTRA_DEFAULT, format_string, __VA_ARGS__)
#define my_printf_extra(extra, format_string, ...) \
my_printf_impl(extra, format_string, __VA_ARGS__)
很多年前我写了一个自定义打印函数,声明如下:
void my_printf(char *format_string, ... )
{
// too complex to list here
}
我可以这样称呼它:
my_printf("Number of apples = %d\n",apple);
此功能一直运行良好。我现在希望制作一个包装函数,它在开始时采用一个额外的整数,如下所示:
void my_printf_extra(int extra,char *format_string, ...
)
可以这样称呼:
my_printf_extra(debug_level,"Number of apples = %d\n",apple);
我希望包装函数以如下方式调用原始函数:
void my_printf_extra(int extra,char *format_string, ... )
{
if (extra == some_test)
{
my_printf(** not quite sure what goes here **);
}
}
我的猜测是:
void my_printf_extra(int extra,char *format_string, ... )
{
va_list vptr;
if (extra == some_test)
{
va_start(vptr,format_string);
my_printf(format_string,vptr);
va_end(vptr);
}
}
但它不起作用。在我的最终输出中,我看到
Number of apples = -46467968
或一些这样的垃圾数字(当真实值为 1 时)。使用字符串调用 my_printf_extra 时,我看到了类似的垃圾。我怀疑我对 va_list 的处理是错误的,但我无法理解到底是怎么回事。
编辑: my_printf() 非常灵活,可以打印到各种不同的地方。有时它只是将文本附加到 rich-edit-control-window。这完全取决于各种标志以及正在打印的内容。
由于 my_printf
不期望 va_list
,您不能将其传递给它。
在这种情况下使用宏是有意义的:
#define my_printf_extra(extra, format_string, ... ) \
do {\
if ((extra) == some_test)\
{\
my_printf((format_string), __VA_ARGS__);\
}\
} while (0)
__VA_ARGS__
宏替换了所有额外的参数。请注意,这需要支持 C99 的编译器。
或者,您可以修改 my_printf 以添加额外的逻辑,将名称更改为内部名称,然后将 my_printf
和 my_printf_extra
定义为调用内部函数的宏:
void my_printf_impl(int extra, char *format_string, ... )
{
if (extra != some_test) {
return;
}
...
}
#define EXTRA_DEFAULT 0
#define my_printf(format_string, ...) \
my_printf_impl(EXTRA_DEFAULT, format_string, __VA_ARGS__)
#define my_printf_extra(extra, format_string, ...) \
my_printf_impl(extra, format_string, __VA_ARGS__)