2013-08-27 85 views
8

typedef int (xxx)(int yyy);似乎定义了一个名为xxx的函数指针,它指向一个整数参数为yyy的函数。如何理解“typedef int(xxx)(int yyy);”?

但我不明白这句法......任何一个人都能给出一个好的解释吗?


我发现typedef int xxx(int yyy);仍然有效。他们之间有什么不同?

+1

您可能会发现[此解释](http://c-faq.com/decl/spiral.anderson.html)有帮助。 – icktoofay

+0

你错过了一个'*','typedef int(* xxx)(int yyy);'定义了一个函数指针 –

+0

@AlterMann不,它不是我的代码。我认为它定义了一个函数指针,但似乎没有,我不知道。 – Sayakiss

回答

15

这定义了函数类型,而不是函数指针类型。

typedef的模式是它修改任何声明,而不是声明一个对象,它声明一个别名到对象将有的类型。

这是完全有效的:

typedef int (xxx)(int yyy); // Note, yyy is just an unused identifier. 
// The parens around xxx are also optional and unused. 

xxx func; // Declare a function 

int func(int arg) { // Define the function 
    return arg; 
} 

C和C++语言具体地,并且幸运的是,不允许使用一typedef名作为在函数定义的整个类型。

+1

很好的解释!显示如何调用这个函数会有帮助,例如,是否可以在函数调用中使用'typedef'名称。 – verbose

+3

@verbose该函数与其他函数一样被调用。 typedef名称的存在不影响任何内容。不确定它如何应用于通话。 – Potatoswatter

+0

你可以使用这个函数类型来定义一个函数指针,就像我为了提高可读性而展示的那样。 –

0

是的,typedef int (xxx)(int yyy);与定义功能类型的typedef int xxx(int yyy);相同。您可以从第156页C 11标准草案N1570中找到一个示例。从该页面引用,

All three of the following declarations of the signal function specify exactly the same type, the first without making use of any typedef names.

typedef void fv(int), (*pfv)(int); 
    void (*signal(int, void (*)(int)))(int); 
    fv *signal(int, fv *); 
    pfv signal(int, pfv); 
0

如果在声明T x一些声明符x,然后T x(t1 p1, t2 p2)意味着功能使用参数P1,P2,作为声明符X是之前有返回相同的类型。周围的声明符

圆括号表示应用括号第一内部修饰。

在你的情况下,括号内没有修饰符。这意味着他们没有必要。

函数原型意味着有一个函数在某处有这个签名,它的名字是Blah

Typedef与功能的原型意味着让我们给功能签名命名为blah。这并不意味着具有此签名的任何功能都存在。这个名字可以用作一个类型。例如:

typedef int xxx(int yyy); 

xxx *func_ptr;  // Declaration of a variable that is a pointer to a function. 
xxx *func2(int p1); // Function that returns a pointer to a function. 
+0

'T x'是声明,'x'是声明。 – Potatoswatter

+0

好吧,我想这一点,但我写的并不好。我会更新。 –

相关问题