用typedef定义函数指针类型(转)

typedef可以用于定义函数指针类型:

【语法】
typedef <返回类型> (*<函数类型名>)(参数表)
typedef <返回类型> (<类名>::*<函数类型名>)(参数表)

【用途】
1、可以用来定义该函数类型的函数指针,就不用每次使用函数指针都要写一次函数原型了;
2、有了类型名,就可以使用在容器里面,譬如map<int, 类型名>,用于实现灵活的函数调用。

【示例】

例1:
typedef void (*PF)(int x);

void func1(int x){ cout<<"func1:"<<x<<endl;}

void func2(int x){ cout<<"func2:"<<x<<endl;}

void main()
{
  PF pFunc;    //声明一个函数指针只需要用PF类型名
  pFunc = func1;  //此处也可以使用pFunc = &func1;
  pFunc(38);
  pFunc = func2;
  pFunc(99);
}

-----------------------------------------------------------------------------------------------

例2:
class CUtil
{
public:
  CUtil();
  typedef void (CUtil::*pUFunc)(int);  //定义原型为void CUtil::func(int)的函数指针的别名为pUFunc
  map<int, pUFunc> funcMap;     //可以用做map容器的元素类型
  void laner(int x);
  void execute();
};

CUtil::CUtil()
{
  funcMap[0] = &CUtil::laner;  //这里初始化map容器,关联数字0和函数laner
}

void CUtil::laner(int x)
{
  cout<<"laner:"<<x<<endl;
}

void CUtil::execute()
{
  (this->*funcMap[0])(38);   //调用map[0]关联的函数
  //注意1:这里必须使用this->,否则会有error C2171: “*”: “void (__thiscall CUtil::* )(int)”类型的操作  数非法的错误
  //注意2:这里必须使用*解引用,才能实现函数调用,否则会有error C2064: 项不会计算为接受 1 个参数的函数的错误
}

void main()
{
  CUtil pUtil = new CUtil();
  pUtil->execute();
  (pUtil->*(pUtil->funcMap[0]))(38);  //与上一句等效,注意括号要用正确
}

用typedef定义函数指针类型(转),布布扣,bubuko.com

时间: 2024-10-08 10:44:41

用typedef定义函数指针类型(转)的相关文章

使用typedef给函数指针类型一个别名

//使用typedef给函数指针类型一个别名 //typedef没有定义新的类型,给已经有的类型起一个别名,减少输入 typedef int(PADD)(int a, int b); //类型, PADD存储函数地址 typedef void(*MEG)(char s[]); void main() { PADD padd1 = add; //创建函数指针 printf("%d",padd1(11,23)); MEG meg1 = msg; meg1("心里的雨倾盆的下&qu

用typedef定义函数指针的问题

在学习windows API的时候,遇到下面这段代码 以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName 这种给数据类型取一个函数名字的还是第一次看到, 于是做了一下实验,如下图: 上图定义了一个TemplateFn模版函数和Addition函数, 用TemplateFn声明了一个变量a,并将Addition赋值给a, 结果编译器报错: 如上图蓝色光标所示,数据不匹配. 原因是因为Addition返回的是一个函数指针,也即地

c++11 using关键字代替typedef定义函数指针

#include <windows.h> typedef int(__stdcall *pMessageBoxA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); using pFnMessageBoxA = int(__stdcall *)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); int main() { pMessageBoxA MessageBoxA

结构体中定义函数指针

转自:http://blog.csdn.net/unix21/article/details/9293877 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n }; 形式2:在定义类型的同时定义变量 struct结构体标识符 { 成员变量列表;… } *指针变量名;

c语言定义函数指针和typedef简写

二种方法来定义函数指针 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 int add(int a, int b) 6 { 7 return a + b; 8 } 9 10 //void msg(char s[]) 11 //void (*p)(char s[]) 函数指针的定义方法 12 //void (*)(char *s) 函数指针的类型 13 14 void msg(char

C++定义函数指针

一: 如何定义函数指针 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可: int (*pf)(int,int);//未初始化 这个函数指针可调用所有的有两个int形参的,并且返回类型为int的函数,将函数名赋给指针变量就行 二:用typedef定义函数指针 原文地址:https://www.cnblogs.com/chengzxhang/p/11518713.html

由typedef和函数指针引起的危机

由typedef和函数指针引起的危机 昨天阅读了大神强哥的代码,发现里面用到了函数指针,也用到的typedef.本来我自以为对这两个概念有一定的认识,但是突然发现这两个东西居然用到了一起!!!!(在一起了也不说一声,一点心理准备都没有): typedef int (* fp)(void *para, void *end); 瞬间就蒙了,这是个啥东西???于是我开始看书,上网查资料,想弄明白.在这个过程中,我发现自己不仅仅是对这两个概念理解不够!!!而是,对数组.指针.变量的理解都不够.这引发了我

如何声明函数指针类型

函数指针就是指向函数的指针,可以用与函数指针类型对应的函数名赋值,可以用来调用函数.全局函数指针常用于回调(函数). 声明函数指针类型应根据其所指向的函数去声明. 例如声明函数 int fun(int i,float k); 的函数指针类型,只需仿照函数这样写 typedef int (*Pfun)(int i, float k); 如此便可定义该类型的函数指针变量 Pfun pfun = NULL;

typedef定义函数类型或函数指针

转载请标明出处: 最近在看redis的代码,发现了有关函数指针的部分,想把它记下来. 在redis中有类似下面的定义,利用typedef 定义了一个新的类型,这种类型是一个函数: typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask); 然后可以用这个类型定义一个指针,这个指针指向一个函数,具体redis中使用如下(具体redis的源码解析,后面的文章中还会提到): ae