如何用typedef定义函数类型?

时间:2019-11-25 11:02:22

标签: c typedef function-declaration

我想知道是否可以使用typedef定义函数类型,我尝试了以下语法:

typedef int (*) (void *, void *) order;

但是它不起作用。 错误消息:expected identifier or '(' before ')' token

4 个答案:

答案 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是一个函数模板,并且声明是该类型的函数指针声明。这使函数指针语法与对象指针一致。