C语言中利用va_list的函数能否反复调用?

2026-04-16 19:453阅读0评论SEO教程
  • 内容介绍
  • 相关推荐

本文共计427个文字,预计阅读时间需要2分钟。

C语言中利用va_list的函数能否反复调用?

在下面的程序中,可变参数函数`process_message`通过`va_list argp`参数将变量参数传递给`print_message`。`argp`接着传递给`vsnprintf`,以计算格式化字符串的长度。但是,如果将`argp`传递给另一个从`print_message`中调用的函数,则会发生错误。

在下面的程序中,可变参数函数process_message通过va_list argp参数将其变量参数传递给print_message. argp又传递给vsnprintf,后者计算格式字符串的长度.

C语言中利用va_list的函数能否反复调用?

但是,如果将argp传递给另一个从print_message中调用的函数,例如vprintf(fmt,argp),它会产生无意义的输出.使用va_list参数的函数是否可以多次使用它?

#include <stdio.h> #include <stdarg.h> void process_message(const char *fmt, ...); void print_message(const char *fmt, va_list argp); int main(void) { process_message("%s:%d\n", "test message", 1); return 0; } void process_message(const char *fmt, ...) { va_list argp; va_start(argp, fmt); print_message(fmt, argp); va_end(argp); } void print_message(const char *fmt, va_list argp) { /*Calculate and print the length of the format string*/ int len = vsnprintf(NULL, 0, fmt, argp); printf("Length of format string = %d\n", len); /*Print the rendered format string - this produces a nonsense output *if argp was aleady passed to another function earlier */ vprintf(fmt, argp); } 你可以使用 va_copy

The va_copy() macro copies the (previously initialized) variable argument list src to dest. The behavior is as if va_start() were applied to dest with the same last argument, followed by the same number of va_arg() invocations that was used to reach the current state of src.

你print_message()可能是:

void print_message(const char *fmt, va_list argp) { /*Calculate and print the length of the format string*/ va_list argp_copy; va_copy(argp_copy, argp); int len = vsnprintf(NULL, 0, fmt, argp_copy); va_end(argp_copy); printf("Length of format string = %d\n", len); /*Print the rendered format string - this produces a nonsense output *if argp was aleady passed to another function earlier */ vprintf(fmt, argp); }

注意:

使用复制的va_list后不要忘记调用va_end.

C11:

Each invocation of the va_start and va_copy macros shall be matched by a corresponding invocation of the va_end macro in the same function.

本文共计427个文字,预计阅读时间需要2分钟。

C语言中利用va_list的函数能否反复调用?

在下面的程序中,可变参数函数`process_message`通过`va_list argp`参数将变量参数传递给`print_message`。`argp`接着传递给`vsnprintf`,以计算格式化字符串的长度。但是,如果将`argp`传递给另一个从`print_message`中调用的函数,则会发生错误。

在下面的程序中,可变参数函数process_message通过va_list argp参数将其变量参数传递给print_message. argp又传递给vsnprintf,后者计算格式字符串的长度.

C语言中利用va_list的函数能否反复调用?

但是,如果将argp传递给另一个从print_message中调用的函数,例如vprintf(fmt,argp),它会产生无意义的输出.使用va_list参数的函数是否可以多次使用它?

#include <stdio.h> #include <stdarg.h> void process_message(const char *fmt, ...); void print_message(const char *fmt, va_list argp); int main(void) { process_message("%s:%d\n", "test message", 1); return 0; } void process_message(const char *fmt, ...) { va_list argp; va_start(argp, fmt); print_message(fmt, argp); va_end(argp); } void print_message(const char *fmt, va_list argp) { /*Calculate and print the length of the format string*/ int len = vsnprintf(NULL, 0, fmt, argp); printf("Length of format string = %d\n", len); /*Print the rendered format string - this produces a nonsense output *if argp was aleady passed to another function earlier */ vprintf(fmt, argp); } 你可以使用 va_copy

The va_copy() macro copies the (previously initialized) variable argument list src to dest. The behavior is as if va_start() were applied to dest with the same last argument, followed by the same number of va_arg() invocations that was used to reach the current state of src.

你print_message()可能是:

void print_message(const char *fmt, va_list argp) { /*Calculate and print the length of the format string*/ va_list argp_copy; va_copy(argp_copy, argp); int len = vsnprintf(NULL, 0, fmt, argp_copy); va_end(argp_copy); printf("Length of format string = %d\n", len); /*Print the rendered format string - this produces a nonsense output *if argp was aleady passed to another function earlier */ vprintf(fmt, argp); }

注意:

使用复制的va_list后不要忘记调用va_end.

C11:

Each invocation of the va_start and va_copy macros shall be matched by a corresponding invocation of the va_end macro in the same function.