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

C99中的哪个条款禁止通过typedef定义函数?,c,function,c99,C,Function,C99,我知道函数定义不能通过typedef完成。 例如: typedef int f_t(int x, int y); f_t fsum { int sum; sum = x + y; return sum; } 但我在C99中找不到禁止这一定义的条款。哪些条款相关,以及它们如何禁止该定义?描述功能定义的条款中立即给出了这一点: 6.9.1功能定义 约束条件 2-函数定义中声明的标识符(即函数名称)应具有函数类型,如函数定义的声明器部分所规定。141) 141)目的是函数定

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

typedef int f_t(int x, int y);

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

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

描述功能定义的条款中立即给出了这一点:

6.9.1功能定义 约束条件 2-函数定义中声明的标识符(即函数名称)应具有函数类型,如函数定义的声明器部分所规定。141)

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

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

td(
参数类型列表

td(
标识符列表opt

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

有助于考虑尝试的TyWIFF函数定义的语法分解:

typedef int F(void);

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

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

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

6.9.1功能定义 约束条件 2-函数定义中声明的标识符(即函数名称)应具有函数类型,如函数定义的声明器部分所规定。141)

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

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

td(
参数类型列表

td(
标识符列表opt

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

有助于考虑尝试的TyWIFF函数定义的语法分解:

typedef int F(void);

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

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

因为您询问禁止在函数定义中使用typedef的意图(在某些注释中),C99的基本原理是这样的:

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

typedef int p(int q, int r); 
以下片段无效:

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

因此,typedef的函数定义似乎是不被允许的,因为在这种情况下,该定义看起来不太像一个函数。

既然你问的是禁止在函数定义中使用typedef的意图(在一些评论中),C99的基本原理是这样说的:

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

typedef int p(int q, int r); 
以下片段无效:

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

因此,typedef的函数定义似乎是不被允许的,因为在这种情况下,该定义看起来不太像函数。

我已经阅读了该条款,但我不明白我们是如何获得目的的。该条款是否需要函数声明器?它只需要一个声明器。“fsum”是一个合法的声明符。@junwanghe“fsum”是一个声明符,但是没有声明说明符
f\t
它没有函数类型。谢谢,这个答案很有用。我已经阅读了这个条款,但我不明白我们是如何得到这个意图的。这个条款需要函数声明符吗?它只需要一个声明器。“fsum”是一个合法声明符。@junwanghe“fsum”是一个声明符,但没有声明说明符
f\u t
它没有函数类型。谢谢,这个答案很有用。相关:相关: