c - 如果我在 C 中省略了 main 函数的返回类型怎么办?

标签 c

在任何人将其标记为相关问题的重复之前。我强调我确实已经阅读了所有这些问题。但我仍然有一些疑问(是的,有点迂腐:))

对于 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. 

我的审讯来了。

  1. 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 ... ,它清楚地说 如果我们省略返回类型 - 因此 } 将到达 -
    终止状态为未指定

    根据undefinedunspecified标准的定义, 我应该说它给出了未指定的值因为无论它返回什么是 合法的 int 值,但结果未定义 - 我们无法预测什么值 会导致什么灾难性的后果?

  2. 在 c99 中,int 类型是强制性的,但是 gcc --std=c99 给定一个没有 int 类型的测试(实际上没有返回类型)只给出 waring:return 'main' 的类型不是 'int' ,但不是错误 ?

    详情:相关部分同c89。

    引用: -- 5.1.2.2.1 程序启动 --

    它应该定义为返回类型 int 和 ...

    和 -- 4. 一致性 --

    1。在本国际标准中,“应”被解释为对实现或程序的要求;相反,“不应”被解释为 禁止。

    所以 shall 在这个标准中应该被解释为 ma​​datory ,为什么 gcc with swith --std=c99 违反了这个?

最佳答案

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

对于 C99,隐式 int 规则已被删除,因此 main() 未定义。 但是,编译器只需要在遇到违反 ShallShall 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/

相关文章:

c - 为什么 C 不使用特殊的转义字符串终止字符终止字符串?

C 中不区分大小写的字符串比较

c - gcc makefile 无法编译

c - 将值添加到 char* [][]

ios -c 文件日志消息

c - strtok_r 的行为不符合预期

c - 如果您 fork() 并且 fork 的(子)进程退出,所有 VM 页面在父进程中是否仍标记为 COW?

c - 将简单的算牌功能重构为多种功能?

c - fprintf() 打印 0 而不是完整的浮点值(转换问题?)

C - 扫描动态二维字符数组并进行分配