我想知道是否可以使用typedef
定义函数类型,我尝试了以下语法:
typedef int (*) (void *, void *) order;
但是它不起作用。
错误消息:expected identifier or '(' before ')' token
答案 0 :(得分:5)
如果别名是变量声明,则应将别名放在变量名所在的位置。
这里:
typedef int (*order) (void *, void *);
// ^~~~~
或者,如果您要使用函数类型而不是指向函数的指针:
typedef int order(void *, void *);
答案 1 :(得分:1)
此typedef
typedef 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 *);
请注意,您可以将typedef名称用作函数参数的类型说明符。例如,这两个声明
void h( porder arg );
void h( order arg );
声明相同的一个函数,因为编译器会隐式调整具有函数类型的参数的类型,以指向该函数类型的指针。
但是,您不能将这些typedef互换用于函数返回类型,因为函数可能不会返回函数,但是它们可能会返回指向函数的指针。所以这个声明
porder h( void );
将编译。但是这个声明
order h( void );
无法编译。
没有typedef,返回指向其他函数的指针的函数的声明将很复杂。例如此声明
porder h( void );
没有typedef的
int ( *h( void ) )( void *, void * );
答案 2 :(得分:0)
您可以选择
typedef int (*order) (void *, void *);
typedef int order(void *, void *);
取决于您是否要键入函数或指针的定义。
两者都有优点和缺点;我更喜欢这样的一种样式,即这样的指针是可见的,并且我的函数定义为
order order_impl;
int order_impl(void * a, void * b)
{
}
order * order_pointer = order_impl;
这可以确保正确定义函数。
但是,其他人则更喜欢使用函数指针类型并这样做
porder order_pointer = order_impl;
在没有上述保障的情况下生活,在不匹配的情况下只给他们一个警告,而不是一个错误。
答案 3 :(得分:0)
您可以像声明函数一样声明函数指针,除了将函数名称括在括号中并在名称前写上*
。
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;
typedef
是一个函数模板,并且声明是该类型的函数指针声明。这使函数指针语法与对象指针一致。