为什么我们不能使用类型名称定义函数?

时间:2015-12-21 22:41:39

标签: c function types language-lawyer c11

任何想法为什么我们不能使用类型名称定义函数:

typedef int functype(int arg1);


functype funcdefinition {
    ;
}

但我们可以这样宣布:

functype funcdeclaration;

3 个答案:

答案 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}}相同的相同主体
  • 通过精确类型检查,函数体数据类型只能指向完全相同的代码的函数。
  • 如果在类型定义中使用了函数体,那么即使具有相同原型的函数(但不同的主体)在技术上也会导致类型不匹配。当前版本的&#34; C&#34;是强类型的。因为&#34; C和C ++(do)不允许在需要另一种类型时使用一种类型。&#34;,即使C编译器要在类型定义中包含函数体(它没有),除了报告不匹配的类型之外,编译器无法解析函数体中的差异。

<小时/>

虽然它没有带有body的typedef那么有用,但你 CAN STILL 使用这个typedef创建一个函数指针 - 而且C ++编译器仍会检查参数列表;见下文:

funcdefinition

从这个意义上说,使用typedef是有帮助的,因为它避免了函数指针语法。

参考文献:

http://www.drtak.org/teaches/modules/0027/module/node7.html

答案 2 :(得分:0)

将函数定义为

xxx myfunction(...) {}

你说我的函数是一个返回xxx的函数。例如,

int myFunc()[]

说myFunc返回一个int。因此

functype funcdefinition() { ... }  

表示funcdefinition返回一个functype,它(如果你的例子是正确的)将意味着它返回&#34;一个带整数参数并返回一个int&#34;的函数。