【问题标题】:Rules for implicit int return type in ANSI C function declarationsANSI C 函数声明中隐式 int 返回类型的规则
【发布时间】:2019-10-05 06:03:55
【问题描述】:

我知道f(void) { return 0; } 的返回类型为int,尽管没有指定,但以下内容呢:

(*f())[]{}

(*g())(){}

const*h(){}

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

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

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

【问题讨论】:

  • 您真的在问 1989 年的 ANSI C 标准吗?您是使用 30 年前的代码还是使用 30 年前的编译器为系统编写新代码?还是您在选择要询问的标准版本时犯了错误?
  • @EricPostpischil 我正在编写代码高尔夫(让程序做某事的最少字节),我发现我可以将int*h(){} 写成*h(){} 并且找不到原因(据我所知,C89 是唯一具有默认 int 返回类型的标准,这个问题可能有意义)
  • 正如 Eric 所说,讨论史前标准毫无意义。当它过时时,许多程序员甚至还没有出生
  • @P__J__:我说没有这样的事情,这不是真的。今天有旧代码在使用,有些人需要使用它。
  • 哈哈@这些cmets。 “这与我无关,所以毫无意义”

标签: c language-lawyer c89


【解决方案1】:

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

函数定义: 声明说明符opt 声明符声明列表opt 复合语句

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

这些语法术语的含义是:

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

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

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

【讨论】:

  • 或 C90 中的 6.7.1 和 6.5.2,这是 OP 似乎正在关注的。并注意到gcc -ansi 仍然意味着-std=c90,即使 gcc 的 default 最终已更新为 gnu11
  • @dave_thompson_085 好的。碰巧我有一份 C89 草案,但没有一份 C90
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2012-01-03
  • 2012-02-29
  • 2016-08-10
相关资源
最近更新 更多