PFUNC是一个函数指针,它指向的函数没有输入参数,返回int。使用这个类型定义名可以隐藏复杂的函数指针语法,就我本人强烈建议我们大内弟子使用这种方式来定义;
下面是一个例子,一个简单函数指针的回调(在GNU编译器上通过,在VC上需要改变一个头文件就OK了)
#include<iostream> //GNU 编译器 g++ 实现
using namespace std;
/* //vc 的实现
#include "stdafx.h"
#include <iostream.h>
*/
#define DF(F) int F(){ cout<<"this is in function "<<#F<<endl;\
return 0; \
}
//声明定义DF(F)替代 int F();函数;
DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g); DF(h); DF(i); //声明定义函数 a b c d e f g h i
// int (*pfunc)(); //一个简单函数指针的声明
typedef int(*FUNC)(); //一个函数指针类型的声明
FUNC ff = {a,b,c,d,e,f,g,h,i}; //声明一个函数指针数组,并初始化为以上声明的a,b,c,d,e,f,g,h,i函数
FUNC func3(FUNC vv){ //定义函数func3,传入一个函数指针,并且返回一个同样类型的函数指针
vv();
return vv;
}
/*FUNC func4(int (*vv)()){ //func3的另一种实现
vv();
return vv;
}*/
int main(){
for(int i=0;i<sizeof(ff)/sizeof (FUNC);i++){ //循环调用函数指针
FUNC r=func3(ff[ i ]);
cout<<r()<<endl; //输出返回值,只是返回了0
}
return 0;
}
到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。
好了,先到此为止吧,写这篇文章耗费了基本上快半天的时间了,很多事情还没有做,等改天有时间再回来整理,所有的源程序都放在openlab3服务器上我的目录下lib/cpp下,大家可以去拿。不知道的登陆openlab3 然后cd ~chengx/lib/cpp就可以看到了。
还有很复杂的声明可能也是一种挑战 比如<<Think in c++>>里的
int (*(*f