gcc 可以配合-E选项,查看宏定义替换后的代码,宏定义本质是替换,宏定义函数不能用于定义不定参数函数,而函数指针可以。
/**gcc 可以配合-E选项(gcc -E -o def def.c > 1.txt),查看宏定义替换后的代码,宏定义本质是替换,宏定义函数不能用于定义不定参数函数,而函数指针可以。**/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
double fun_args(int num,...)
{
double sum = 0.0,t;
va_list argptr;
va_start(argptr,num);//初始化变元指针
while(num--)
{
t = va_arg(argptr,double);
sum = sum + t;
}
va_end(argptr);
return sum;
}
double fun_arg_1(int a,double b)
{
return a*b;
}
double fun_arg_2(int a,double b,int c)
{
return a+b+c;
}
double func_pfn1(int a,double b ,double (*pfn1)(int,double,...))
{
double result = (*pfn1)(a,b);
printf("%f\n",result);
}
double func_pfn2(int a,double b ,int c,double (*pfn1)(int,double,...))
{
double result = (*pfn1)(a,b,c);
printf("%f\n",result);
}
double fun_arg_abc(int a,double b)
{
return a*b;
}
double fun_arg_def(int a,double b)
{
return a+b;
}
#define ABC abc
#define DEF def
#define FUN_ARG(type) fun_arg_##type
#define LOOKUP_SYMBOL_AU_QUICK 0
#define LOOKUP_SYMBOL_AU_OBJFILE 1
#define LOOKUP_SYMBOL_AU(suffix) lookup_symbol_aux_##_suffix
#define FUN_T(type,a,b)\
({\
double result = 0;\
switch(type)\
{\
case LOOKUP_SYMBOL_AU_QUICK:\
{\
result = FUN_ARG(abc)(a,b);\
break;\
}\
case LOOKUP_SYMBOL_AU_OBJFILE:\
{\
result = FUN_ARG(def)(a,b);\
break;\
}\
}\
result;\
})
double fun_define(int type ,int a,double b)
{
double result =0;
result = FUN_T(type,a,b);
return result;
}
double (*pfn1)(int,double,...)=fun_arg_1;
double (*pfn2)(int,double,...)=fun_arg_2;
static double (*pfn_m[2])(int,double,...);
int main()
{
pfn_m[0] = fun_arg_1;
pfn_m[1] = fun_arg_2;
func_pfn1(1,22,pfn_m[0]);
func_pfn2(11,33,100,pfn_m[1]);
double d = fun_define(LOOKUP_SYMBOL_AU_QUICK,11,33);
printf("%f\n",d);
double d1 = fun_define(LOOKUP_SYMBOL_AU_OBJFILE,22,10);
printf("%f\n",d1);
return 0;
}
typedef可以让函数指针更直观方便
形式2:typedef 返回类型(*新类型)(参数表)
- typedef char (*PTRFUN)(int);
- PTRFUN pFun;
- char glFun(int a){ return;}
- void main()
- {
- pFun = glFun;
- (*pFun)(2);
- }
#include <stdio.h>
void do_stuff(int my_arg,int b)
{
printf("arg0 = %d\n", my_arg);
}
void do_stuff1(int my_arg,int b)
{
printf("arg1 = %d\n", my_arg+b);
}
void do_stuff2(int my_arg,int b)
{
printf("arg2 = %d\n", my_arg+b);
}void do_stuff3(int my_arg,int b)
{
printf("arg3 = %d\n", my_arg+b);
}
typedef void (*method)(void*,...);
#define READ 1
#define WRITE 0
#define IS_AHB 1
void test(int wr,int is_ahb)
{
method t1 = do_stuff;
(*t1)(33);
t1 = do_stuff1;
(*t1)(55,100);
method array[4]={do_stuff,do_stuff1,do_stuff2,do_stuff3};
array[wr*2+is_ahb](11,22);
}
int main()
{
test(0,0);
test(1,0);
test(1,1);
test(0,1);
return 0;
}