我知道函数定义不能通过 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) 是标识符后带有括号的那些:
T D(
参数类型列表)
T D(
标识符列表选项)
因此,如果函数是通过 typedef 定义的,则它没有函数声明符的语法形式,因此在 6.9.1p2 中无效。
考虑尝试的 typedef 函数定义的语法分解可能会有所帮助:
typedef int F(void);
F f {}
| | ^^-- compound-statement
| ^-- declarator
^-- declaration-specifiers
请注意, typedef 类型F
是声明说明符的一部分,而不是声明符的一部分,因此(声明符部分)没有函数类型。f
由于您询问的是禁止在函数定义中使用 typedef 的意图(在某些评论中),因此 C99 的基本原理是这样说的:
参数列表必须显式地出现在声明器中;它不能从 typedef 继承(参见 §6.7.5.3)。也就是说,给定定义:
typedef int p(int q, int r);
以下片段无效:
p funk // weird { return q + r ; }
因此,似乎不允许按 typedef 定义函数,因为在这种情况下,定义看起来不够像函数。