1
4

4 回答 4

4

C89/90 仍然有隐含的 int 规则,所以main()等价于int main(). 通过省略返回类型,您已将返回类型隐式定义为int. 有些人可能会认为这很草率,但它是严格遵守的(即,不涉及定义的实现、未定义或未指定的行为)。

对于 C99,隐式int规则已被删除,因此main()未定义。然而Shall,编译器只需要在遇到违反or子句时“发出诊断” Shall not——发出诊断后仍然可以自由地继续编译。究竟什么构成诊断是实现定义的。因此,gcc 在这方面符合要求的只是说明它发出的警告将被视为诊断的文档。

编辑:C89/90 标准中的“隐式int”实际上并不是一个地方的单一规则——它分布在几个地方。第一个是§6.5.2.1,它说:

-- int, signed, signed int, 或没有类型说明符

这是列表的一部分,列表的每一行上的所有项目都被认为是等效的,所以这就是说(除非另有禁止)缺少类型说明符等同于指定 (signed) int

对于函数参数,有一个单独的规范(第 6.7.1 节):“任何未声明的参数都具有类型int。”

于 2012-12-18T14:37:10.573 回答
0

即使在违反约束的情况下,C 编译器唯一必须发出的就是“诊断”。然后允许它继续并产生一个可执行程序。

于 2012-12-18T14:37:29.030 回答
0

请注意那部分:如果 } 终止... ,它清楚地表明如果我们省略返回类型

不,它没有。它说明了当您return exitStatus;main().

根据 ** undefined ** 和 unspecified 标准的定义,我应该说它给出了 unspecified 值,因为它返回的都是合法的 int 值,但后果是 undefined ——我们无法预测什么值会导致什么灾难性的后果。

不,这意味着你不知道你的程序的返回状态码是什么。但是,该行为不是未定义的:您的程序终止。对于什么样的结果代码,这是一个不同的问题。

[...] 只给出警告:'main' 的返回类型不是 'int',但不是错误?

这就是它的实现方式。在旧的 C (C89) 中 - 以及一些较新的编译器 - 如果您省略函数的返回类型,则假定它是int(因此即使警告看起来也有点问题)。

所以应该在这个标准中解释为强制性的,为什么 gcc 和 swith --std=c99 违反了这个?

可能是。请注意,除非您使用 GCC,否则 GCC 是一个不符合标准的实现-ansi -pedantic,因此理论上,没有这些标志编译的任何程序都有未定义的行为。但这是理论...

于 2012-12-18T14:37:34.663 回答
0

这似乎是某种 C90 标准参考错误。我不知道您链接到的文档是否等同于实际的 ISO C90 标准。

显然,多年来,这个特定问题已从未定义变为未指定,再到明确定义。

在“用于 X3.J11 工作组”的 ANSI-C 早期草案中,您会发现以下文本:

2.1.2.2 托管环境

“程序终止”

从初始调用返回到主函数等效于以主函数返回的值作为参数调用退出函数。如果主函数执行一个没有指定值的返回,返回到宿主环境的终止状态是undefined

于 2012-12-18T14:55:44.833 回答