任何想法为什么我们不能使用类型名称定义函数:
typedef int functype(int arg1);
functype funcdefinition {
;
}
但我们可以这样宣布:
functype funcdeclaration;
答案 0 :(得分:1)
标准说(C11第6.9.1节):
函数定义中声明的标识符(函数的名称)应具有函数类型,由函数定义 162)的声明符部分指定
脚注162说:
162)意图是函数定义中的类型类别不能从typedef继承:
typedef int F(void); // type F is ‘‘function with no parameters // returning int’’ F f,g; // f and g both have type compatible with F F f { /* ... */ } // WRONG: syntax/constraint error F g() { /* ... */ } // WRONG: declares that g returns a function int f(void) { /* ... */ } // RIGHT: f has type compatible with F int g() { /* ... */ } // RIGHT: g has type compatible with F F *e(void) { /* ... */ } // e returns a pointer to a function F *((e))(void) { /* ... */ } // same: parentheses irrelevant int (*fp)(void); // fp points to a function that has type F F *Fp; // Fp points to a function that has type F
因此,
functype funcdefinition;
声明funcdefinition
的类型为functype
,这是正确的。函数原型中不需要函数参数的名称。在
functype funcdefinition { ... }
需要参数名称,并且无法声明函数参数的名称,因此语法不正确。
答案 1 :(得分:1)
您可以为函数原型定义typedef,但不能为函数体定义。
functype
的typedef(在上面的问题中)是为函数原型创建一个typedef - 而不是函数体。在" C"语言,包含函数体的函数 将不会计算为有效类型。这就是不允许使用函数体的原因。
为什么C语言不允许类型包含函数体?这是因为:
functype
的唯一类型将具有与<{1}}相同的相同主体
<小时/>
虽然它没有带有body的typedef那么有用,但你 CAN STILL 使用这个typedef创建一个函数指针 - 而且C ++编译器仍会检查参数列表;见下文:
funcdefinition
从这个意义上说,使用typedef是有帮助的,因为它避免了函数指针语法。
参考文献:
答案 2 :(得分:0)
将函数定义为
时xxx myfunction(...) {}
你说我的函数是一个返回xxx的函数。例如,
int myFunc()[]
说myFunc返回一个int。因此
functype funcdefinition() { ... }
表示funcdefinition返回一个functype,它(如果你的例子是正确的)将意味着它返回&#34;一个带整数参数并返回一个int&#34;的函数。