在任何人将其标记为相关问题的重复之前。我强调我确实已经阅读了所有这些问题。但我仍然有一些疑问(是的,有点迂腐:))
对于 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 , 我没有找到关于 undefined 的任何信息,但是 unspecified?
详情:C89中的相关部分是5.1.2.2.1程序启动和5.1.2.2.3程序终止(注意:两者都在5.1.2.2 Hosted environment部分,我们后面的讨论仅限于此)
引用: -- 5.1.2.2.3 程序终止 --
从初始调用到 main 函数的返回是 相当于用值调用退出函数 由主函数作为参数返回。10 如果 } 终止主要功能到达, 返回到主机环境的终止状态是 未指定。
只需注意那部分:If the } that terminated ... ,它清楚地说 如果我们省略返回类型 - 因此 } 将到达 -
终止状态为未指定根据undefined和unspecified标准的定义, 我应该说它给出了未指定的值因为无论它返回什么是 合法的 int 值,但结果未定义 - 我们无法预测什么值 会导致什么灾难性的后果?
在 c99 中,int 类型是强制性的,但是
gcc --std=c99
给定一个没有 int 类型的测试(实际上没有返回类型)只给出 waring:return 'main' 的类型不是 'int' ,但不是错误 ?详情:相关部分同c89。
引用: -- 5.1.2.2.1 程序启动 --
它应该定义为返回类型 int 和 ...
和 -- 4. 一致性 --
1。在本国际标准中,“应”被解释为对实现或程序的要求;相反,“不应”被解释为 禁止。
所以 shall 在这个标准中应该被解释为 madatory ,为什么 gcc with swith --std=c99 违反了这个?
最佳答案
C89/90 仍然有隐含的 int 规则,所以 main()
等同于 int main()
。通过省略返回类型,您已将返回类型隐式定义为 int
。有些人可能认为这很草率,但它是严格遵守的(即,不涉及任何实现定义、未定义或未指定的行为)。
对于 C99,隐式 int
规则已被删除,因此 main()
未定义。 但是,编译器只需要在遇到违反 Shall
或 Shall not
子句时“发出诊断”——它仍然是免费的发出诊断后继续编译。究竟什么构成诊断是实现定义的。因此,要使 gcc 在这方面保持一致,所需的只是说明它发出的警告被视为诊断的文档。
编辑:C89/90 标准中的“implicit int
”实际上并不是一个地方的单一规则——它分布在几个地方。主要的是 §6.5.2.1,它说:
--
int
,signed
,signed int
, or no type specifiers
这是列表的一部分,其中列表每一行上的所有项目都被认为是等效的,所以这就是说(除非另有禁止)缺少类型说明符等同于指定(签名)int
。
对于函数参数,有一个单独的规范(在 §6.7.1 中):“任何未声明的参数都具有类型 int
。”
关于c - 如果我在 C 中省略了 main 函数的返回类型怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935104/