[英]main() function in C
几周以来,我一直在以自学成才的方式学习C编程,而且我对main()
函数有一些问题。
所有函数必须在它们的函数原型中声明,然后在它们的定义中声明。 为什么我们不必先在原型中声明main()
函数?
为什么我们必须使用int main()
而不是void main()
?
返回0在main()
函数中完全做了什么? 如果我编写一个程序以return 1;
main()
函数,会发生什么? , 例如?
void main
,但这是一个非标准的扩展(通常意味着“总是向操作系统返回零”)。 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
表示成功,而其他值表示不同类型的故障。
您无法自由选择main的返回类型, 因为您没有编写调用main的代码 。 在您考虑学习C之前,代码调用main已经存在。它是由提供C运行时启动代码的人编写的 ,通常在您不知情的情况下自动链接到您的可执行文件。 此代码通常驻留在名为crt0.o的文件中(从crt0.c创建,甚至在crt0.s中创建汇编程序)。 它期望使用指示成功(0)或失败(非零)的返回值,以及可能的其他信息,例如代码是否由于信号而终止,如果是,则是哪一个。 这些是Unix历史记录,我在此不再重复:-)
1)不一定; 定义也可作为声明。 其次,对于main
只有几个有效的签名,除非你正在为IOCCC写一个条目,否则你通常不会在你的代码中调用main
。
2)简答:因为语言定义是这样说的。 更长的答案:这是您的程序指示主机环境成功或失败的方式。 单个实现可以自由支持main
其他签名,但必须记录这些额外的签名。 如果您的编译器文档没有将void main()
列为合法签名,那么您不应该使用它。
3)按照惯例(至少在首次使用C的* nix系统上),状态为0表示成功,非零状态表示......除成功之外的其他事项。 究竟什么值对应于实现的状态。
1)它是假的,你只能创建一个函数的定义。
2)我们可以知道main()函数是否正确终止
3)相同,除了在你的shell中它将被写1而不是0
函数不一定首先被声明为原型。 只有在我们需要在定义函数之前使用函数时才需要这样的声明。
main 根据定义具有int类型。
从main返回的值的含义是常规的。 普遍接受的惯例是0被认为是成功的,而不是0某种失败。
1.通过识别内置关键字“main”,C库隐式调用main()函数。 所以我们不需要为main函数声明一个原型。
2.我不确定,但我认为这取决于所用编辑器的类型。 在Turbo C中,将接受void main(),而在dev-cpp中,main()应返回一个值。
3.return 0只退出退出状态为0的程序,换句话说,返回值决定了主线程的退出状态。
简单地说,你所有问题的最重要的是传统和一致性。 工具链,操作系统等知道这个程序调用main()的方式必须首先从用户代码空间(程序)中调出...
具体来说:1)因为我所说的一致性。 您不需要声明,因为工具链和操作系统已经知道main。 还有其他一致性函数,如exit()。
2)当主要时间返回时,操作系统可以从中返回结果。 通常非零意味着错误。 因此,当U使用脚本或其他程序调用您的程序时,例如main()函数,您可以检查它是否成功。
3)返回零以外的东西意味着错误。 但实际上你可以按照你想要的方式解释这个价值。 但正如我所说OS可以得到结果。
附加信息:main()实际上不是您启动程序时将被调出的第一个函数(您已编写)。 但实际上,操作系统和工具链可以在您的主要设置环境,设置环境,初始化或其他任何操作之前进行其他调用。 但是当你编写代码时,你并不直接知道这一点,而你根本不需要处理它并考虑它。 在嵌入式系统中,通常会有一些非常低级的函数被调用来设置CPU主时钟,中断,堆栈等。像IAR这样的工具链实际上可以让你在调用main之前执行自己的代码。
希望这有助于:)
当我们运行C程序时,计算机控制转移到C程序main()函数,从那里C程序开始执行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.