我想知道是否可以使用typedef
来定义函数类型,我尝试了以下语法:
typedef int (*) (void *, void *) order;
但是它不起作用。 错误信息:
在 ')' 标记之前期望标识符或 '('
我想知道是否可以使用typedef
来定义函数类型,我尝试了以下语法:
typedef int (*) (void *, void *) order;
在 ')' 标记之前期望标识符或 '('
如果它是一个变量声明,别名应该放置在变量名应该放的位置。
这里:
typedef int (*order) (void *, void *);
// ^~~~~
或者,如果你想要一个函数类型而不是指向函数的指针:
typedef int order(void *, void *);
qsort
函数时进行转换。 - ThunderPhoenixqsort
的警告信息! - ThunderPhoenixint name(const void *, const void *)
。那么您就不需要进行转换了。 - HolyBlackCattypedef int (*order )(void *, void *);
定义了一个指向类型为 int( void *, void * )
的函数指针的别名。
这个 typedef
typedef int order(void *, void *);
定义了一个类型为int( void *, void * )
函数类型的别名。
如果要使用一个typedef来同时定义指针和函数类型的别名,可以这样写:
typedef int ( *porder )( void *, void * ), order(void *, void *);
int typedef ( *porder )( void *, void * ), order(void *, void *);
void h( porder arg );
void h( order arg );
声明同一个函数,因为编译器会自动调整函数类型的参数类型为指向函数类型的指针。
但是,你可能无法将这些typedef用于函数返回类型的可互换性,因为函数不能返回函数,但它们可以返回指向函数的指针。所以这个声明:
porder h( void );
这段代码将会编译通过。但是这个声明
order h( void );
无法编译。
如果没有 typedef,返回指向其他函数的指针的函数声明将变得复杂。例如,这个声明:
porder h( void );
int ( *h( void ) )( void *, void * );
int* x, (*y)(int), z;
这样的代码。 - Lundin你可以执行以下任一操作:
typedef int (*order) (void *, void *);
typedef int order(void *, void *);
根据您想要typedef函数还是指针的情况而定。
两种方法都有优缺点;我更喜欢一种风格,其中指针作为指针可见,并且我的函数定义为
order order_impl;
int order_impl(void * a, void * b)
{
}
order * order_pointer = order_impl;
porder order_pointer = order_impl;
在没有这种保护的情况下生活,只留下警告而不是错误提示,以防出现不匹配的情况。
*
即可。void func (void); // function
void (*func) (void); // pointer to function
typedef void (*func) (void); // pointer to function type
然而,我推荐的风格是不要在 typedef
后面隐藏指针:
typedef int order_t (void*, void*);
...
order_t* order;
< p > typedef
是一个函数模板,声明是该类型的函数指针声明。这使函数指针语法与对象指针一致。