2017-07-19 58 views
1

使用的typedef如果我想声明typedef某种类型,我会去像这样的语法,在这个例子:函数指针用C

typedef int INT 

但是,当我想创造一个typedef一个功能,我期待下面的语法是一个:

typedef void (*)(int, char) myfunc; 

不是正确的一句是:

typedef void (*myfunc)(int, char); 

那么为什么第一个不正确?

+0

看看[这个答案](https://stackoverflow.com/a/30345939/4265352)。它解释了如何读取C变量和类型声明。 – axiac

+0

typedef是无关紧要的。这就是你如何定义类型的变量。 – StoryTeller

+1

@StoryTeller这不是一个完全重复的,它会询问函数指针的声明语法,而不是* typedef声明。 –

回答

6

A typedef看起来完全像“正常”声明。如果你声明一个函数指针,它应该是这样的:

void (*myfunc)(int, char); 

因此,typedef看起来是一样的,与申报的标识符不参考类型的对象,唯一的区别,但是到了类型别名代替:

typedef void (*myfunc)(int, char); 

至于“?为什么” - 好了,因为语言就是这样设计的,但我想,一旦你了解它瓦特orks,它可以说是最简单的方法,不要为typedef声明引入不同的语法。这种设计遵循最少意外的原则,以不同的方式处理声明将不必要的复杂。

+0

因此,规则不是如下: 如果我有一个称为类型的类型,我可以使用'typedef类型名称'创建一个名为Name的typedef。 但是,规则是: 如果有这样的声明_declarator name_我可以通过关键字'typedef'转发delcarator的名称为typedef。 –

+0

@BiteBytes是的。 PeterJ的答案显示了这适用于typedef'ing数组类型。 –

+2

@BiteBytes:在句法上,'typedef'被视为像'auto'或'extern'这样的存储类说明符,即使它具有不同的含义。所以是的,'typedef'的形式是一个正则声明的形式,只是在其前面加了'typedef'关键字。 –

0

的基本方法来创建函数指针是void (*myfunc)(int, char);

所以要创建一个新的类型,它是一个函数指针作为参数是 typedef void (*myfunc)(int, char);

,这就是为什么它返回void,并得到intchar第一个是不正确的

function pointer之前不需要添加(*)

0

但是,当我想创造一个函数的类型定义,我期待 以下语法是一个:

typedef void (*)(int, char) myfunc;

当然你也可以写你自己的编译器你自己的语言。

但是C语法就是这样。

下面是另一个例子:

typedef char foo[10];