我已经用自学成才的方式学习C编程几周了,我对main()
函数有一些问题。
所有函数必须在它们的函数原型中声明,然后在它们的定义中声明。为什么我们不必先在原型中声明main()
函数?
为什么我们必须使用int main()
代替void main()
?
在main()
函数中返回0的确是什么?例如,如果我用[{1}}编写一个以main()
函数结尾的程序,会发生什么?
答案 0 :(得分:19)
void main
,但这是一个非标准的扩展(通常意味着“总是向操作系统返回零”)。答案 1 :(得分:17)
1)所有函数必须在它们的函数原型中声明,然后在它们的定义中声明。为什么我们不必先在原型中声明main()函数?
不正确。简单的例子:
void foo(){} //definition
int main()
{
foo();
return 0;
}
只有在调用一个函数但尚未看到定义时,才需要声明。 main
永远不会发生这种情况,因为它是该计划的明星。
2)为什么我们必须使用int main()而不是void main()?
因为标准是这样说的。 (更准确地说,它在托管环境中是正确的,通常就是这种情况)
C99 5.1.2.2.1 程序启动
程序启动时调用的函数名为
main
。实施宣布否 这个功能的原型。它应定义为返回类型int
且没有 参数:int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):int main(int argc, char *argv[]) { /* ... */ }
或同等的;或者以其他一些实现定义的方式。
3)在main()函数中返回0的确切做什么?如果我编写一个程序以返回1返回main()函数,会发生什么?例如?
返回值表示程序的结果。通常0
表示成功,而其他值表示不同类型的失败。
答案 2 :(得分:2)
您无法自由选择main 的返回类型,因为您没有编写调用main 的代码。在您考虑学习C之前,代码调用main已经存在。它是由提供 C运行时启动代码的人编写的,它通常在您不知情的情况下自动链接到您的可执行文件。此代码通常驻留在名为crt0.o的文件中(从crt0.c创建,甚至在crt0.s中创建汇编程序)。它期望使用指示成功(0)或失败(非零)的返回值,以及可能的其他信息,例如代码是否由于信号而终止,如果是,则是哪一个。这些是Unix的历史,我不会在这里重复: - )
答案 3 :(得分:1)
1)不一定;定义也可作为声明。其次,main
只有少数有效签名,除非您正在为IOCCC写一个条目,否则通常不会在代码中调用main
。
2)简短回答:因为语言定义是这样说的。更长的答案:这是您的程序指示主机环境成功或失败的方式。单个实现可以免费支持main
的其他签名,但必须记录这些额外的签名。如果您的编译器文档未将void main()
列为合法签名,则不应使用它。
3)按照惯例(至少在首次使用C的* nix系统上),状态0表示成功,非零状态表示......不是成功。究竟什么值对应于实现的状态。
答案 4 :(得分:0)
1)它是假的,你只能创建一个函数的定义。
2)我们可以知道main()函数是否正确终止
3)相同,除了在你的shell中它将被写1而不是0
答案 5 :(得分:0)
不一定要先将函数声明为原型。只有在我们需要在定义函数之前使用函数时才需要这样的声明。
main根据定义类型为。
从main返回的值的含义是常规的。普遍接受的惯例是0被认为是成功的,而不是某种失败。
答案 6 :(得分:0)
1.通过识别内置关键字“main”,C库隐式调用main()函数。所以我们不需要声明main函数的原型。
2.我不确定,但我认为这取决于所用编辑器的类型。在Turbo C中,将接受void main(),而在dev-cpp中,main()应该返回一个值。
3.return 0简单地以退出状态0退出程序,换句话说,返回值确定主线程的退出状态。
答案 7 :(得分:0)
简单地说,你所有问题的最重要的是传统和一致性。 工具链,操作系统等知道这个名为main()的过程必须首先从用户代码空间(程序)中调出...
现在特别说明: 1)因为我所说的一致性。您不需要声明,因为工具链和操作系统已经知道main。还有其他一致性函数,如exit()。
2)当主要时间返回时,操作系统可以从中返回结果。通常非零意味着错误。因此当你使用脚本或其他程序调用你的程序时,例如main()函数,你可以检查它是否成功。
3)返回零以外的东西意味着错误。但实际上你可以按照你想要的方式解释这个价值。但正如我所说,操作系统可以得到结果。
其他信息: main()实际上不是启动程序时将调用的第一个函数(您已编写)。但实际上,操作系统和工具链可以在您的主要设置环境,设置环境,初始化或其他任何操作之前进行其他调用。但是当你编写代码时,你并不直接知道这一点,而你根本不需要处理它并考虑它。在嵌入式系统中,通常会有一些非常低级的函数被调用来设置CPU主时钟,中断,堆栈等。像IAR这样的工具链实际上可以让你在调用main之前执行自己的代码。
希望这有助于:)
答案 8 :(得分:0)
当我们运行C程序时,计算机控制将传递给C程序 main()函数,C程序本身将从此处开始执行