宏定义与函数指针

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  返回类型(*新类型)(参数表)

[cpp]  view plain  copy
  1. typedef char (*PTRFUN)(int);   
  2. PTRFUN pFun;   
  3. char glFun(int a){ return;}   
  4. void main()   
  5. {   
  6.     pFun = glFun;   
  7.     (*pFun)(2);   
  8. }
 typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN

#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;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值