ANSI C函数声明中的隐式int返回类型的规则

时间:2019-05-17 22:33:15

标签: c language-lawyer c89

我知道f(void) { return 0; }的返回类型为int,即使未指定,但以下内容如何:

(*f())[]{}

(*g())(){}

const*h(){}

此编译器在-ansi -Werror -pedantic的gcc上没有错误,并且仅抱怨clang中缺少return语句:https://godbolt.org/z/jAYL4v

f的返回类型为int(*)[]g的返回类型为int(*)(),而h的返回类型const int*的类型。

在ANSI C标准中,我似乎找不到规则。我检查了[6.5.4.3函数声明符(包括原型)]和[6.7.1函数定义],但是甚至在隐式int返回类型上都找不到任何东西(某些示例代码除外)。我在找错地方了吗?这是有效的代码吗?

1 个答案:

答案 0 :(得分:4)

函数定义(C89 3.7.1)的语法为:

  

功能定义:       declaration-specifiers opt 声明者声明列表 opt 复合语句

与C99相同,只是在C89中 declaration-specifiers 是可选的。

这些语法术语的含义是:

  • 声明说明符存储类说明符类型说明符类型限定符的任意组合em>;分别是staticfloatconst的例子。
  • 声明符,非正式地,是可能出现在此处的任何内容:int ______ ;。当然有一个正式的定义,但是我提到了这种方法,因此您可以将术语与您对声明语法的现有理解联系起来。
  • 声明列表是指K&R风格的参数声明。
  • 复合语句是语句的大括号列表(可能为空)。

在您的问题中,以下是声明符:(*f())[] (*g())() *h()。因此,在它们后跟{}(这是 compound-statement )是合法的。 h还有一个 declaration-specifier

在C89中,还有一条规则(3.5.2):在一组声明说明符中不提供 type-specifier 等同于提供int 。 C99添加了一个约束条件“每个声明中的声明说明符中至少应提供一个类型说明符”。