我知道函数定义不能通过typedef来完成。 例如:
typedef int f_t(int x, int y);
f_t fsum
{
int sum;
sum = x + y;
return sum;
}
但是我找不到在C99中禁止这个定义的规定。哪些条款有关,以及它们如何禁止这个定义?
答案 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,因为在这种情况下定义看起来不像函数。