1

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

typedef int f_t(int x, int y);

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

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

4

2 回答 2

4

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

6.9.1 函数定义

约束

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

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

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

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

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

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

typedef int F(void);

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

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

于 2013-10-21T17:16:41.807 回答
0

由于您询问的是禁止在函数定义中使用 typedef 的意图(在某些评论中),因此 C99 的基本原理是这样说的:

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

typedef int p(int q, int r); 

以下片段无效:

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

因此,似乎不允许按 typedef 定义函数,因为在这种情况下,定义看起来不够像函数。

于 2013-10-21T18:08:53.960 回答