首页 > 关于用typedef定义函数指针类型

关于用typedef定义函数指针类型

今天在《python源码分析》上看到: typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);

不太理解为什么用binaryfunc就是一个函数类型指针了。

类比于typedef char A; 不应该是typedef PyObject * (PyObject *, PyObject *) ( *binaryfunc );么


这是C标准规定的写法,不是用来理解的。

但是可以教你一个小窍门用来记忆:

a) 定义一个函数

PyObject * FunctionName(PyObject *, PyObject *);

b) 上句前面加上typedef

typedef PyObject * ( * FunctionName)(PyObject *, PyObject *);

这样写的话, b 中定义的函数指针类型FunctionName,就是 a 中函数FunctionName的类型。

从这个规则可以推断,这种语法可能是早期C编译器用来简化实现设计的。

c) 实际上 b 的写法可以进一步化简,去掉星号和括号:

typedef PyObject * FunctionName(PyObject *, PyObject *);

这个规则跟使用函数指针调用函数时一样,两种写法都是对的:

typedef int func (int, int);
int add(int a, int b) { return a + b; }
...
func x = add;
(*x)(2, 3); //标准写法
x(2, 3);  //简化写法

typedef主要作用是用来给一个数据类型来取一个别名(包括变量,函数等等),这样做的作用就是为了方便、简洁。 typedef PyObject * (binaryfunc)(PyObject *, PyObject *); 这个定义你可以先抛开 typedef关键字,即PyObject * (binaryfunc)(PyObject *, PyObject ); 这个语句的含义是:binaryfunc 是一个函数指针,指向的函数需要2个指向PyObject类型变量的指针作为参数,并且这个函数返回一个指向 PyObject 类型变量的指针。理解了去掉typedef 关键字的语句含义之后,再把typedef关键字加上,加上之后就把binaryfunc这样一个具有复杂含义的变量取了一个简单的别名。 在这个定义之后的代码中,出现 binaryfunc func;这样的定义,那么func就是一个刚才描述的函数指针了。 你可以将 func带入到typedef 定义的语句中,用func替换 binaryfunc:typedef PyObject * (func)(PyObject *, PyObject );然后去掉typedef关键字:PyObject * (func)(PyObject *, PyObject *);这样就还原了binaryfunc func; 。


推荐一个网站:

cdecl.com

为了方便我把PyObject换成了int

【热门文章】
【热门文章】