gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:03:17 26 4
gpt4 key购买 nike

我知道 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 Function declarators (including prototypes)] 和 [6.7.1 Function definitions],但甚至找不到有关隐式 int 返回类型的任何内容(某些示例代码除外)。我只是找错地方了吗?这是有效代码吗?

最佳答案

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

function-definition: declaration-specifiersopt declarator declaration-listopt compound-statement

这与 C99 相同,只是 声明说明符 在 C89 中是可选的。

这些语法术语的含义是:

  • declaration-specifiersstorage-class-specifiertype-specifiertype-qualifier 的任意组合em>;其中的例子分别是static, float, const
  • 声明符,非正式地,是任何可能出现在这里的东西:int ______ ;。它当然有一个正式的定义,但我提到了这种方法,因此您可以将术语与您对声明语法的现有理解联系起来。
  • declaration-list 是指 K&R 风格的参数声明。
  • 复合语句 是语句的括号列表(可能为空)。

在您的问题中,以下是声明符:(*f())[] (*g())() *h() 。因此,在它们后面加上 {}(即复合语句)是合法的。 h 也有一个声明说明符

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

关于c - ANSI C 函数声明中隐式 int 返回类型的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com