当我遇到C程序的return语句/退出语句时,我只是编写了一个计算某些内容的快速程序。
我将main()
声明为int
类型,因此我必须返回一个整数,否则我的程序将无法正确编译。但是,main
成为Boolean
甚至是void
是否可以接受?
我知道创建C程序的标准方法是返回一个值,以便可以解决任何问题,但是Boolean
不会以相同的方式工作吗?另外,我是否可以声明void
并且在终止后仍然运行我的程序时操作系统没有问题?
感谢您的帮助。
答案 0 :(得分:6)
C99标准说:(§5.1.2.2.1程序启动)
程序启动时调用的函数名为main。实施宣布否 这个功能的原型。它应该用返回类型int 定义,并且没有 参数:
int main(void) { /* ... */ }
或有两个参数(这里称为argc和argv,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或同等的;或者以其他一些实现定义的方式。
因此,在托管环境中,int
是唯一有效的标准返回类型。实现可以定义其他入口点。
请注意,第5.1.2.2.3节程序终止部分包含:
如果main函数的返回类型是与int兼容的类型,则从中返回 对main函数的初始调用相当于使用值调用exit函数 由main函数返回作为其参数; 到达终止的 main函数返回值0 。如果返回类型与int不兼容,则 返回到主机环境的终止状态未指定。
所以,只要您的main
返回main
,您就可以在C99中省略int
的合法回复。
(但以前版本的C标准没有main
的例外 - 没有返回值(或没有返回语句到达最终}
)导致“终止状态返回到主机环境[未定义] 。“。)
答案 1 :(得分:2)
这是一个可能感兴趣的link。似乎你的问题的答案不是那么顺利。我也看到编译器(MS Visual C)接受void
作为返回类型。
答案 2 :(得分:1)
摘要:您不一定非必须,但您应该这样做。
在C90中,在不执行main()
语句的情况下到达return
的末尾“返回到主机环境的终止状态未定义”。在我使用的至少一个系统中,返回的状态为1,在该系统上表明程序失败。
C99添加了一条新规则,称到达main()
的末尾返回0.(C ++具有相同的规则。)并非所有编译器都完全实现C99,而那些通常不符合C99的编译器默认编译器。
您可以从main()
返回的唯一可移植值为0,EXIT_SUCCESS
和EXIT_FAILURE
(后两者在<stdlib.h>
。0和{{1}中定义表示程序成功(并且EXIT_SUCCESS
通常定义为0); EXIT_SUCCESS
表示程序失败。EXIT_FAILURE
很常见,但不可移植;我曾经在系统(VMS),终止状态为1表示成功。如果您希望程序可移植,请使用return 1;
表示失败;这就是它的用途。某些系统和程序定义其他系统特定或应用程序 - 具体的状态代码。
对于可移植性(以及恕我直言,样式),最好在EXIT_FAILURE
结尾处进行明确的return 0;
,尽管在所有情况下都不需要。添加一行代码(最糟糕的是,无害)要比浪费时间确定是否需要它更容易。
请注意main()
的正确定义是:
main()
和
int main(void) { /* ... */ }
或等效文件(例如,您可以编写int main(int argc, char *argv[]) { /* ... */ }
而不是char **argv
)。 char *argv[]
是否有效是值得怀疑的,由于微妙的原因,我不会在这里讨论。同样,添加int main() { /* ... */ }
关键字比在浪费时间确定是否需要它更容易。
许多书籍和教程都使用void
或void main()
。特定的编译器可能会选择允许这样做,但它不可移植。在书籍或教程中看到void main(void)
是一个很好的迹象,表明作者不太了解C标准,你应该找到其他的东西来学习。
答案 3 :(得分:0)
调用main()的代码期望它返回int(或调用exit())。您无法更改调用main()(它是操作系统或运行时的一部分)的代码,因此您最好返回int。
答案 4 :(得分:0)
根据ISO,标准是返回int。见本文件第5.1.2.2.1节:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf。同样有趣的是Stroustrup对这个与C和C ++相关的问题的评论:http://www2.research.att.com/~bs/bs_faq2.html#void-main。
答案 5 :(得分:0)
返回类型必须为int
,如其他答案所述。但是,您假设必须根据此返回值是错误的,main
是一个例外。 C99标准规定了这一点,因此在不使用return
的情况下实现main是完全正确的。
答案 6 :(得分:0)
在ANSI C中,main ()
通常具有int
的返回类型,但它实际上可以是实现定义的;这意味着不同的编译器和平台接受不同的签名,但标准的int main ()
和int main (int, char**)
保证格式正确。
它与其他非void函数不同,因为它不需要return
语句。如果没有提供,并且返回类型被指定为int
,则编译程序就像在return 0;
中的最后一个语句之后存在隐式main ()
一样。
标准的相关部分:
5.1.2.2.3程序终止
1 如果
main
函数的返回类型是与int
兼容的类型,则来自return
对main
函数的初始调用等同于使用值调用exit
函数 由main
函数返回作为其参数;到达终止的}
main
函数返回值0
。如果返回类型与int
不兼容,则 返回到主机环境的终止状态未指定。
不要引用我这个,但是在K + R中,事情有点宽松,我认为你甚至不需要指定一个返回类型,所以{{ 1}}实际上是一个有效的K + R程序。