如何用typedef定义函数类型?

How to define function type with typedef?

我想知道是否可以使用 typedef 定义函数类型,我试过这种语法:

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

但是没用。 错误信息:expected identifier or '(' before ')' token

如果是变量声明,别名应该放在变量名所在的位置。

这里:

typedef int (*order) (void *, void *);
//            ^~~~~

或者,如果您想要函数类型而不是指向函数的指针:

typedef int order(void *, void *);

你做任何一个

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;

并且在没有上述保障的情况下生活,在不匹配的情况下只给他们一个警告而不是一个错误。

这个类型定义

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

为指向int( void *, void * ).

类型函数的指针类型定义别名

这个类型定义

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 );

声明同一个函数,因为编译器将具有函数类型的参数的类型隐式调整为指向函数类型的指针。

但是,对于函数 return 类型,您不能互换使用这些类型定义,因为函数可能 return 函数但它们可能 return 指向函数的指针。所以这个声明

porder h( void );

将编译。但是这个声明

order h( void );

不会编译。

如果没有 typedef,return 指向其他函数的指针的函数声明将会很复杂。例如这个声明

porder h( void );

没有 typedef 看起来像

int ( *h( void ) )( void *, void * );

你像函数一样声明一个函数指针,除了你把函数名放在括号里,并在名字前面写一个*

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