宏定义中的可变参数 **…**可用宏__VA_ARGS__替代
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
int add(int a,int b,int c,int d,int f);
#define INDIRECT_CALL_1(f, f1, ...) \
({ \
(f == f1) ? f1(__VA_ARGS__) : f(__VA_ARGS__); \
})
#define FUN_TEST(f,...) ({f(__VA_ARGS__);})
#define FUN_TEST2(f,...) f(__VA_ARGS__)
int main()
{
int n=0;
int s=0;
int s2=0;
n = INDIRECT_CALL_1(add,add,1,2,1,1,1);
s=FUN_TEST(add,2,3,1,1,1);
s2 = FUN_TEST2(add,7,8,1,1,1);
printf("n=%d,s=%d,s2=%d\n",n,s,s2);
return 0;
}
int add(int a,int b,int c,int d,int f)
{
return a+b+c+d+f;
}
结果:
n=6,s=8,s2=18
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
#include <stdarg.h>
int abc(int n,...);
int def(int x,va_list *args);
int hij(int z,va_list args);
int i=0;
int main()
{
int a=0;
a = abc(3,"abc","def","hij","lmk","qwe");
return 0;
}
int abc(int n,...)
{
char *q=NULL;
va_list ap;
va_start(ap,n);
hij(n,ap);
q=va_arg(ap,char *);
printf("q=%s\n",q);
def(n,&ap);
hij(n,ap);
def(n,&ap);
va_end(ap);
return 0;
}
int def(int x,va_list *args)
{
char *p=va_arg(*args,char *);
printf("i=%d,p=%s\n",i++,p);
return 0;
}
int hij(int z,va_list args)
{
char *p=va_arg(args,char *);
printf("i=%d,p=%s\n",i++,p);
return 0;
}
结果:
i=0,p=abc
q=def
i=1,p=hij
i=2,p=lmk
i=3,p=qwe