我无法理解我从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
的方法。