[初]小议typedef

typedef void (*ptr_fun)(int ,int);

 因为刚学C++,这种typedef 函数指针的用法令我有点困惑?

我对于上面的形式的唯一问题就是,这有什么用?

 

先简单介绍下typedef的用法:

typedef 顾名思意就是创建一个新的类型名(不是新类型!)

typedef unsigned int  U32;

typedef 旧名字  新名字(其中旧名字必须是一个已经存在的类型名)

所以你typedef blackPig pinkPig;编译器就不知道你想干吗了.

 

切入主题->typedef void (*ptr_fun)(int ,int);有什么用?(问题A)

现看下面这个小例子

//author:snail

//date:070404

#include <iostream>
#include <cstdio>

using namespace std;


//####################################################
void fun1(char* c,int&){
 cout << c << "/n";
}
void (*ptr_fun1)(char*,int&);
//typedef void (*ptr_fun1)(char *,int &);
ptr_fun1 fun2(ptr_fun1 ptr){return ptr;}    //ptr_fun1是什么?这里能做为类型吗?
//#####################################################


int main(int argc,char* argv[]){
 int i = 100;
 fun1("hello",i);
 ptr_fun1 = fun1;
 ptr_fun1("one more hello",i);

 system("pause");
 return 0;
}

编译时红色代码那里不能通过,错误原因是:

BS_function_1_070404.cpp:13: error: `ptr_fun1' does not name a type

这句话的意思,在这里ptr_fun1是一个变量名,而不是一个类型名,所以无法作为fun2函数声明中形参的类型名,那现在的问题是如果我们需要以这样的形式传入函数指针,我们应该怎么办?(问题B)

问题A和问题B很有趣,一个是另一个的答案,所以两个问题联系起来不难理解

要实现这样的形式,必须借助typedef 这个工具创建某一个能够具体函数指针的新类型

即typedef void (*ptr_fun1)(char *,int &);

这里的 void 和 (*ptr_fun1)(char*,int &)不是联系在一起的,前面的void是系统已经存在的类型,后面(*ptr_fun1)(char *,int &)指ptr_fun1是一个接受两个参数而且返回类型(匿名)等于'旧类型'void的一个函数指针类型

 

 

这可以理解为一个间接命名:

typedef A  B;  最常用的用法

[typedef A  B(C->B);] --> typedef A C; 创建函数指针类型的用法(B和C有联系,但B给匿名了,这里只创建了一个新类型名C);

 

 

使用了typedef以后的程序!

//author:snail

//date:070404

#include <iostream>
#include <cstdio>

using namespace std;


//####################################################
void fun1(char* c,int&){
 cout << c << "/n";
}

typedef void (*ptr_fun1)(char*,int&);
//typedef void (*ptr_fun1)(char *,int &);
ptr_fun1 fun2(ptr_fun1 ptr){return ptr;}     //#####################################################


int main(int argc,char* argv[]){
 int i = 100;
 fun1("hello",i);

ptr_fun1 = fun1//错误,这里ptr_fun1不再是一个变量名了,不能直接使用
 

ptr_fun1 ptr;

 ptr = fun1;
 ptr("one more hello",i);

fun2(ptr)("one more more hello!",i);//现在终于可以以这种形式调用函数指针了,这都是typedef的功劳

 system("pause");
 return 0;
}

 作者:snail
日期:07年4月4日
参考资料:<<C++程序语言设计特别版>>B.S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值