gcc错误消息传递了指向va_list的指针

时间:2019-03-10 20:37:07

标签: c gcc variadic-functions

我无法理解我从gcc收到的以下来源的错误:

#include <stdio.h>
#include <stdarg.h>

static void variable_arguments2(int n, va_list *ap) {
    for(int i=0; i<n; i++) {
        printf("%d\n", va_arg(*ap, int));
    }
}

static void variable_arguments1(int n, va_list ap) {
    variable_arguments2(n, &ap);
}

static void variable_arguments(int n, ...) {
    va_list args;
    va_start( args, n );
    variable_arguments1(n, args);
}

int main(void) {
    variable_arguments(3, 32, 45, 67);
    return 0;
}

我用

进行编译
$ gcc -Wall test.c -o test

错误是:

test.c: In function 'variable_arguments1':
test.c:11:25: warning: passing argument 2 of 'variable_arguments2' from incompatible pointer type [-Wincompatible-pointer-types]
  variable_arguments2(n, &ap);
                         ^
test.c:4:13: note: expected '__va_list_tag (*)[1]' but argument is of type '__va_list_tag **'
 static void variable_arguments2(int n, va_list *ap) {
             ^~~~~~~~~~~~~~~~~~~

variable_arguments2()函数接受指向va_list的指针作为参数,并且在variable_arguments1()函数中,我恰好传递了这个,或者至少我认为是。
所以我根本不理解错误消息。
如果我按如下所示更改函数variable_arguments1()

static void variable_arguments1(int n, va_list ap) {
    va_list args;
    va_copy(args,ap);
    variable_arguments2(n, &args);
}

gcc不再报告任何错误或警告,并且可执行文件按预期工作。
但是我不知道为什么我的第一种方法无法编译。然后我想知道是否存在另一种无需创建副本就将指针传递到va_list的方法。

0 个答案:

没有答案