我知道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返回类型上都找不到任何东西(某些示例代码除外)。我在找错地方了吗?这是有效的代码吗?
答案 0 :(得分:4)
函数定义(C89 3.7.1)的语法为:
功能定义: declaration-specifiers opt 声明者声明列表 opt 复合语句
与C99相同,只是在C89中 declaration-specifiers 是可选的。
这些语法术语的含义是:
static
,float
和const
的例子。int ______ ;
。当然有一个正式的定义,但是我提到了这种方法,因此您可以将术语与您对声明语法的现有理解联系起来。在您的问题中,以下是声明符:(*f())[]
(*g())()
*h()
。因此,在它们后跟{}
(这是 compound-statement )是合法的。 h
还有一个 declaration-specifier 。
在C89中,还有一条规则(3.5.2):在一组声明说明符中不提供 type-specifier 等同于提供int
。 C99添加了一个约束条件“每个声明中的声明说明符中至少应提供一个类型说明符”。