C99中的哪个规定禁止通过typedef定义函数?

时间:2013-10-21 17:05:16

标签: c function c99

我知道函数定义不能通过typedef来完成。 例如:

typedef int f_t(int x, int y);

f_t fsum
{
    int sum;
    sum = x + y;
    return sum;
}

但是我找不到在C99中禁止这个定义的规定。哪些条款有关,以及它们如何禁止这个定义?

2 个答案:

答案 0 :(得分:4)

在描述函数定义的子句中立即给出:

  

6.9.1函数定义

     约束      

2 - 函数定义中声明的标识符(函数的名称)应具有函数类型,由函数定义的声明符部分指定。 141)

     

141)意图是函数定义中的类型类别不能从typedef继承[...]

这种方法的工作方式是在声明符(6.7.5)下,唯一的函数声明符(6.7.5.3)是在标识符后带括号的那些:

  

T D( 参数类型列表 )
  T D( 标识符列表 opt )

因此,如果函数是通过typedef定义的,那么它没有函数声明符的语法形式,因此6.9.1p2无效。

考虑尝试的typedef函数定义的语法细分可能会有所帮助:

typedef int F(void);

F f {}
| | ^^-- compound-statement
| ^-- declarator
^-- declaration-specifiers

请注意,typedef类型F声明说明符的一部分,而不是声明符的一部分,因此f(声明器部分)没有函数类型。

答案 1 :(得分:0)

由于您要求在函数定义中使用禁止typedef的 intent (在某些注释中),因此C99的基本原理可以这样说:

  

参数列表必须显式出现在声明符中;它   不能从typedef继承(参见§6.7.5.3)。也就是说,   根据定义:

typedef int p(int q, int r); 
     

以下片段无效:

p funk  // weird 
{ return q + r ; }

所以似乎不允许使用函数defintion-by-typedef,因为在这种情况下定义看起来不像函数。