【问题标题】:How can i pass a va_list through a function in C90如何通过 C90 中的函数传递 va_list
【发布时间】:2011-04-28 12:16:43
【问题描述】:

我想将 va_list 传递给另一个函数。这是我正在尝试做的一个示例:

void my_printf_1(char* string, ...) {
    va_list ap;
    va_start(ap, string);
    printf(string, ap);
    va_end(ap);
}

void my_printf_2(char* string, ...) {
    va_list ap;
    va_start(ap, string);
    printf(string, *ap);
    va_end(ap);
}

int main(void) {
    my_printf_1("Hello %i\n", 12); //Shows me the pointer
    my_printf_1("Hello \n"); //Runtime Error - too many arguments
    my_printf_2("Hello %i\n", 12); //Displays correctly because 12 < char
    my_printf_2("Hello %i\n", 500); //Displays incorrectly  because 500 > char
    my_printf_2("Hello %i %i\n", 12, 12); //Displays 12, then crashes Runtime Error not enough arguments
    my_printf_2("Hello \n"); //Runtime Error - too Many Arguments
}

在我看来我的va_list ap 是一个char 指针,我怎样才能得到整个列表?我如何重写my_printf() 以将整个或伪造的va_list 传递给子函数?我无法修改我的子函数来接受va_list 指针,所以我必须修改my_printf

编辑: 我意识到以下内容会起作用,但这不是我想要的。

void my_printf_1(char* string, ...) {
    va_list ap;
    va_start (ap, string);
    vprintf(string, ap);
    va_end(ap);
}

【问题讨论】:

  • 您的编译器+头文件可能碰巧将va_list 定义为char*,但这取决于实现。您只能对带有va_startva_argva_copyva_endva_list 进行操作,如 e.g. C99 标准 7.15。

标签: c variadic-functions c89 cvi


【解决方案1】:

你需要按照你说的去做,但要明确。也就是说,传递实际的va_list 对象。

请参阅@987654321@ 函数以获取灵感。在标准库中,采用显式 va_list 的函数通常以 v 为前缀。

va_list 没有可以使用的内部结构,它是不透明的。您所能做的就是在@987654322@ 标头中定义。

【讨论】:

  • 我应该更明确一点,我基本上是想模拟一个真正的 va_list。
  • 除此之外,这是不可能的。您不能使用 C 将参数传递给另一个可变参数函数。
  • 我可以创建一个假的并将其转换为正确的格式吗?例如。通过数组还是结构?
  • va_list 不是不透明的:它甚至记录在 SystemV ABI 中并且它不是不透明的,因为您可以更改字段。我在这里做到了:gitlab.com/eric.saintetienne/revstr#using-vsscanf 当然,它不像任何与 ABI 相关的东西那样可移植。
【解决方案2】:

查看 vprintf 和朋友。 http://www.manpagez.com/man/3/vprintf/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多