今天在《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