在任何人将其标记为相关问题的副本之前。我强调我 DO 已阅读所有这些问题。但我仍然有一些审讯(是的,有点迂腐:))
对于C
一些结论:
1. In C89(C90), this is _undefined_ .
2. In C99(or C11), a type of int is madatory; control flow reached the closing }
will return a value of 0.
这是我的审讯。
在c89中,我没有发现未定义,但未指定?
详情 C89 中的相关部分为 5.1.2.2.1程序启动和 5.1.2.2 .3程序终止(注意:两者均在 5.1.2.2托管环境部分下,我们后面的讨论将受到限制)
引用: - 5.1.2.2.3程序终止 -
A return from the initial call to the main function is
equivalent to calling the exit function with the value
returned by the main function as its argument.10 If the }
that terminates the main function is reached, the
termination status returned to the host environment is
unspecified.
请注意部分:如果}终止...... ,它会清楚地说明
如果我们省略了返回类型 - 那么}将在 -
到达
终止状态为未指定
根据未定义和未指定标准的定义, 我应该说它给出了未指定的值,因为无论它返回的是什么 合法的int值,但结果未定义 - 我们无法预测什么值 会导致什么灾难性的结果?
在c99中,一种int是疯狂的,但是gcc --std=c99
给出了没有int类型的测试(实际上没有返回类型)只给出 waring:'main'的返回类型不是' int',但不是错误?
详细信息:相关部分与c89相同。
引用: - 5.1.2.2.1程序启动 -
It shall be defined with a return type of int and ...
和 - 4.一致性 -
1. In this International Standard, ‘‘shall’’ is to be interpreted as a requirement on an implementation or on a program; conversely, ‘‘shall not’’ is to be interpreted as a
prohibition.
因此 应该被解释为此标准中的 madatory ,为什么带有swith - std = c99 的gcc违反了这个?
答案 0 :(得分:4)
C89 / 90仍然具有隐式int规则,因此main()
等同于int main()
。通过不使用返回类型,您已隐式将返回类型定义为int
。有些人可能会认为这是草率的,但它严格遵守(即,没有实现定义,未定义或未指定的行为)。
对于C99,已删除隐式int
规则,因此未定义main()
。 但是,只有在遇到违反Shall
或Shall not
条款的情况下,编译器才需要“发出诊断” - 在发出诊断后,它仍然可以继续编译。究竟是什么构成诊断是实现定义。因此,gcc在这方面需要遵守的所有内容都是文档说它发出的警告被认为是一种诊断。
编辑:C89 / 90标准中的“隐式int
”在一个地方并不是真正的单一规则 - 它在几个地方传播。主要的是§6.5.2.1,其中说:
-
int
,signed
,signed int
或没有类型说明符
这是列表的一部分,列表中每一行的所有项都被认为是等价的,所以这说(除非另有禁止)缺少类型说明符等同于指定(签名){{1} }。
对于函数参数,有一个单独的规范(在第6.7.1节中):“任何未声明的参数都具有类型int
。”
答案 1 :(得分:0)
即使在违反约束的情况下,C编译器必须发出的唯一内容是“诊断”。然后允许它继续并生成可执行程序。
答案 2 :(得分:0)
请注意部分:如果}终止 ...,则明确说明如果省略返回类型
不,它没有。它说明当您从return exitStatus;
的末尾省略main()
时会发生什么。
根据** undefined **和未指定的标准的定义,我应该说它给出了未指定的值,因为它返回的是一个合法的int值,但结果是未定义的 - 我们无法预测将导致什么值到了什么灾难性的结果。
没有。这意味着您不知道程序的返回状态代码是什么。但是,行为并未未定义:您的程序终止。使用什么样的结果代码,这是一个不同的问题。
[...]仅提供waring:'main'的返回类型不是'int',而不是错误?
这就是它的实施方式。在旧的C(C89)中 - 以及一些较新的编译器 - 如果省略函数的返回类型,则假定它是int
(所以即使警告看起来有点问题)。
所以在这个标准中应该被解释为疯了,为什么用swith -std = c99的gcc违反了这个?
可能是的。请注意,GCC是一个不符合的实现,除非您使用-ansi -pedantic
,因此理论上,任何没有这些标志编译的程序都有未定义的行为。但那是理论......
答案 3 :(得分:0)
这似乎是某种C90标准参考错误。我不知道您链接到的文档是否与实际的ISO C90标准相同。
显然,这个特定问题已经从未定义,未指定,到多年来定义明确。
在ANSI-C"的早期草案中,对于X3.J11工作组",您将找到以下文本:
2.1.2.2托管环境
"程序终止"
从初始调用到main函数的返回是等效的 使用main返回的值调用exit函数 作为它的论点。如果main函数执行返回 指定无值,终止状态返回给主机 环境未定义。