C中的main()函数
几个星期以来,我一直在用自学成才的方式学习C编程,而且我对main()
函数有一些问题。
-
所有函数必须在它们的函数原型中声明,然后在它们的定义中声明。 为什么我们不必先在原型中声明
main()
函数? -
为什么我们必须使用
int main()
而不是void main()
? -
返回0在
main()
函数中完全做了什么? 如果我编写一个程序以return 1;
main()
函数,会发生什么? , 例如?
- 只有在使用函数之前才需要声明函数。 该定义本身就是一个声明,因此不需要先前的原型。 (如果在没有先前原型的情况下定义函数,某些编译器和其他工具可能会发出警告。这是一个有用的指导原则,而不是C语言的规则。)
- 因为C标准是这样说的。 操作系统将返回值传递给调用程序(通常是shell)。 有些编译器会接受
void main
,但这是一个非标准的扩展(通常意味着“总是向操作系统返回零”)。 - 按照惯例,非零返回值表示发生了错误。 Shell脚本和其他程序可以使用它来查明您的程序是否成功终止。
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)不一定; 定义也可作为声明。 其次,主要只有几个有效的签名,除非你正在为IOCCC写一个条目,否则你通常不会在你的代码中调用main
。
2)简答:因为语言定义是这样说的。 更长的答案:这是您的程序指示主机环境成功或失败的方式。 单个实现可以自由支持main
其他签名,但必须记录这些额外的签名。 如果您的编译器文档没有将void main()
列为合法签名,那么您不应该使用它。
3)按照惯例(至少在首次使用C的* nix系统上),状态为0表示成功,非零状态表示……除成功之外的其他事项。 究竟什么值对应于实现的状态。
1)它是假的,你只能创建一个函数的定义。
2)我们可以知道main()函数是否正确终止
3)相同,除了在你的shell中它将被写1而不是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之前执行自己的代码。
希望这有助于:)
函数不一定首先被声明为原型。 只有在我们需要在定义函数之前使用函数时才需要这样的声明。
main 根据定义具有int类型。
从main返回的值的含义是常规的。 普遍接受的惯例是0被认为是成功的,而不是0某种失败。