69,371
社区成员
发帖
与我相关
我的任务
分享
//要求不能switch来判定func是什么函数。否则加一种函数就要改common_func。
//请问common_func的参数怎么定,里面怎么写?
void common_func(void *func, 等)
{
前处理
调用func所对应的函数。
后处理
}
yum install libstdc++-devel.i686
#include "stdarg.h"
int i;
void Func()
{
i++;
}
void Func(int j)
{
i=i+j;
}
union Function
{
void (*func_1)();
void (*func_2)(int);
};
//common_func为一个可变参数函数
//第一个参数指向union,第二个参数表示Func函数的参数个数(通过它来确定调用哪一个函数)
void common_func(union Function func,int num,...)
{
switch(num)
{
case 0:
{
func.func_1();
break;
}
case 1:
{
va_list ap;
va_start(ap,num);
func.func_2(va_arg(ap,int));
va_end(ap);
break;
}
default:
break;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
union Function func;
i=0;
//调用无参的Func函数
func.func_1=Func;
common_func(func,0);
//调用有一个参数的Func函数
func.func_2=Func;
common_func(func,1,3);
return 0;
}
我只能做到这一步了,期待大神出现
#include <stdio.h>
#include <stdarg.h>
void f1(int x)
{
printf("f1: %d\n", x);
}
void f2(int x, int y, int z)
{
printf("f2: %d\n", x + y + z);
}
void f3(char* s)
{
printf("f3: %s\n", s);
}
void common_func(void *func, ...)
{
unsigned int* argStart = &func;
__asm {
mov eax, argStart;
push [eax + 0x14];
push [eax + 0x10];
push [eax + 0x0C];
push [eax + 0x08];
push [eax + 0x04];
mov eax, func;
call eax;
add esp, 20;
}
}
int main()
{
common_func(f1, 10);
common_func(f2, 1, 2, 3);
common_func(f3, "Hello World!");
}
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
void common(void (*pf)(va_list*), ...)
{
va_list vl;
va_start(vl,pf);
pf(&vl);
va_end(vl);
}
int _add(int a, int b)
{
return a + b;
}
void add(va_list* vl)
{
//expect two int
int a,b;
a = va_arg(*vl, int);
b = va_arg(*vl, int);
printf("%d\n", _add(a,b));
}
int main ()
{
common(&add, 1, 2);
return 0;
}