Если вы компилируете C99, вы можете использовать переменные макросы для предоставления переменных аргументов без явной передачи счетчика:
#include <stdio.h>
#include <stdarg.h>
void _foo(size_t n, int xs[])
{
for(int i=0 ; i < n ; i++ ) {
int x = xs[i];
printf("%d\n", x);
}
}
#define foo(arg1, ...) do { \
int _x[] = { arg1, __VA_ARGS__ }; \
_foo(sizeof(_x)/sizeof(_x[0]), _x); \
} while(0)
int main()
{
foo(1, 2, 3, 4);
foo(-1, -2, -3, -4, -5, -6, -7);
return 0;
}
Выход:
1
2
3
4
-1
-2
-3
-4
-5
-6
-7
Однако это не позволяет вам вернуть значение. Вы можете вернуть значение с помощью расширений gcc:
#include <stdio.h>
#include <stdarg.h>
int _foo(size_t n, int xs[])
{
int i;
for(i=0 ; i < n ; i++ ) {
int x = xs[i];
printf("%d\n", x);
}
return n;
}
#define foo(arg1, ...) ({ \
int _x[] = { arg1, __VA_ARGS__ }; \
_foo(sizeof(_x)/sizeof(_x[0]), _x); \
})
int main()
{
int x = foo(1, 2, 3, 4);
printf("foo returned %d\n", x);
x = foo(-1, -2, -3, -4, -5, -6, -7);
printf("foo returned %d\n", x);
return 0;
}
Выход:
1
2
3
4
foo returned 4
-1
-2
-3
-4
-5
-6
-7
foo returned 7
Но, конечно, макросы мертвы. Да здравствуют макросы!
EDIT:
Упс, недостаточно внимательно прочитал ОП. Извините!