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

4
我知道f(void) { return 0; }的返回类型是int,即使没有明确指定,但以下情况呢:
(*f())[]{}

(*g())(){}

const*h(){}

使用-ansi -Werror -pedantic选项在gcc上编译没有错误,仅在clang中会提示缺少返回语句:https://godbolt.org/z/jAYL4v

f的返回类型似乎是int(*)[]g的返回类型似乎是int(*)(),而h的返回类型似乎是const int*

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


2
你是真的在询问1989年的ANSI C标准吗?你是在处理30年前的代码还是为一个使用30年前编译器的系统编写新代码?或者你在选择要询问的标准版本时犯了错误? - Eric Postpischil
3
@EricPostpischil 我曾经为了编写代码高尔夫(使程序最少字节执行某些操作)而写作,我发现我可以把“inth(){}”写成“h(){}”,但我找不出原因(据我所知,C89是唯一一个有默认int返回类型的标准,这个问题才有意义)。 - Artyer
正如Eric所说,讨论一个史前标准是毫无意义的。许多程序员甚至在它过时时还未出生。 - 0___________
2
@P__J__: 我没有说过这样的话,也不是真的。现在服务中有旧代码,有些人需要与之一起工作。 - Eric Postpischil
3
哈哈,这些评论真逗!“这对我没有意义,所以毫无意义”。 - M.M
@mm 1. 他没有使用旧代码工作。 - 0___________
1个回答

4
Function Definitions(C89 3.7.1)的语法为:

function-definition: declaration-specifiers可选项 declarator declaration-list可选项 compound-statement

在C99中,该语法与C89相同,只是C89中的declaration-specifiers是可选的。
这些语法术语的含义如下:
  • declaration-specifiersstorage-class-specifiertype-specifiertype-qualifier的任意组合;例如: staticfloatconst
  • declarator(非正式用语)是可以出现在此处的任何内容:int ______ ;。当然还有一个正式定义,但我提到这种方法是为了让您将术语关联到您对声明语法的现有理解。
  • declaration-list指的是K&R风格的参数声明。
  • compound-statement是由大括号包围的语句列表(可能为空)。
在您的问题中,以下是声明符:(*f())[](*g())()*h()。因此,在其后面跟上{}(即compound-statement)是合法的。其中,h还有一个declaration-specifier
在C89中还有一条规则(3.5.2),即在一组declaration-specifiers中不提供type-specifier相当于提供int。C99增加了一个约束条件:“每个声明中的声明说明符中应至少给出一个类型说明符[...]”。

在C90中,版本6.7.1和6.5.2是OP似乎正在查看的内容。请注意,即使gcc的默认设置最终已更新为gnu11,但gcc -ansi仍然意味着-std=c90 - dave_thompson_085
@dave_thompson_085 好的。恰好我有一份 C89 草案副本,但没有 C90 的副本。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接