阅读C11标准,在谈到main()
时,我读到了:
5.1.2.2.1“...... [main]应定义为返回类型int” 5.1.2.2.3“......如果返回类型与int不兼容,......”
后者表明我可以定义main()
以返回非整数值
如果main“shall”返回int怎么可能?
而且,“实现声明没有这个函数的原型”可以自由地使用非整数返回类型吗? 为什么在紧接着之后说:“[main]应该用返回类型int定义?”
答案 0 :(得分:4)
我的印象是句子
或以其他一些实现定义的方式。
导致混乱。 实现定义的是编译器提供程序为定义和记录的的C标准术语。这并不意味着程序员可以自由选择main
的任意原型。这意味着如果他的编译器文档预见到它,可能会使用不同的原型。
我所知道的唯一其他特定于平台的返回类型是void
,这在某些旧版平台上是允许的。对于main
的参数,我知道允许第三个参数传递指向环境的指针的平台。
答案 1 :(得分:2)
完整的引用说If the return type is not compatible with int, the termination status returned to the host environment is unspecified.
这意味着它是未定义的行为。当main()
退出时,程序基本上终止,main的返回值将用作程序的退出状态。由于在大多数系统上程序只能返回一个整数作为退出状态,因此main的返回值用作退出代码。返回一个字符串或指针或任何意味着你正在返回调用环境无法处理的东西。
答案 2 :(得分:1)
该实现声明此函数没有原型。
也就是说,没有现有的原型;无论您将其定义为int main(void)
,int main (int argc, char *argv[])
,还是以“其他一些实现定义的方式”,您都不会与某些隐式原型发生冲突。
或以其他一些实现定义的方式。
如果我们将此视为管理返回类型,则与后面的内容没有冲突,因为这基本上表示main
的签名可以是您喜欢的任何内容,如果它对实现有意义 - 以及稍后 - 但是,如果main
返回int
或可转换为int
的内容,则从main
返回必须等同于调用exit
(从exit
开始1}}被声明为void exit(int)
)。
反对我阅读的一个可能的观点是,如果这是我的意图,我希望它表示返回类型不是int
时的行为是实现定义的 ,而不是未定义。