C语言 如何用typedef定义函数类型?

polhcujo  于 2023-02-11  发布在  其他
关注(0)|答案(4)|浏览(134)

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

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

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

o0lyfsai

o0lyfsai1#

别名应该放在变量名所在的位置(如果它是变量声明)。
此处:

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

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

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

7lrncoxx2#

此类型定义

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

声明相同的一个函数,因为编译器隐式地将具有函数类型的参数的类型调整为指向该函数类型的指针。
但是你不能互换使用这些typedef(s)作为函数的返回类型,因为函数可能不返回函数,但是它们可能返回指向函数的指针。

porder h( void );

将编译。但是这个声明

order h( void );

将不会编译。
如果没有typedef,返回指向其他函数的指针的函数声明将变得复杂。

porder h( void );

没有typedef的情况看起来像

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

laik7k3q3#

你可以选择

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;

并且在没有所述安全措施的情况下生活,在不匹配的情况下仅给他们留下警告而不是错误。

dgtucam1

dgtucam14#

声明函数指针就像声明函数一样,只是要将函数名用括号括起来,并在函数名前面写一个*

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

相关问题