几周来,我一直在自学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) return 0在main()函数中到底做了什么?例如,如果我编写了一个程序,以返回1结束main()函数,会发生什么?
返回值表示程序的结果。通常0
表示成功,而其他值表示不同类型的失败。
您不能自由选择main的返回类型,因为您没有编写调用main的代码。代码调用main在你考虑学习C之前就已经存在了。它是由提供C运行时启动代码的人编写的,通常在你不知情的情况下自动链接到你的可执行文件。此代码通常驻留在一个名为crt0.o的文件中(从crt0.c甚至crt0.s中的汇编程序创建)。它希望使用一个指示成功(0)或失败(非零)的返回值,以及可能的其他信息,如代码是否因信号而终止,如果是,是哪一个。这些是Unix历史的片段,我不会在这里重复:-)
1)不一定;定义也可以作为声明。其次,无论如何,main
只有几个有效签名,除非您正在为IOCCC编写条目,否则您通常不会在代码中调用main
。
2) 简短的回答:因为语言定义是这样说的。较长的回答:这就是你的程序向宿主环境表明成功或失败的方式。单个实现可以自由地支持main
的附加签名,但它必须记录这些附加签名。如果编译器文档没有将void main()
列为合法签名,那么就不应该使用它
3) 按照惯例(至少在最初使用C的*nix系统上),状态为0表示成功,非零状态表示。。。除了成功之外的其他事情。具体什么值对应什么状态取决于实现。
1)如果为false,则只能创建函数的定义。
2) 我们可以知道main()函数是否正确地终止
3) 除了在您的shell中,它将被写入1而不是0
1.main()函数由C库通过识别内置关键字"main"隐式调用。所以我们不需要为main函数声明一个原型。
2.这个我不确定,但我认为这取决于使用的编辑器类型。在Turbo C中,void main()将被接受,而在dev-cpp-main()中应该返回一个值。
3.return 0只是以退出状态0退出程序,换句话说,return值决定了主线程的退出状态。
简单地说,所有问题的最本质是传统和一致性。工具链、操作系统等都知道,这个名为main()的过程必须首先从用户代码空间(程序)中调用。。。
现在具体来说:1) 因为我说的合规性。您不需要声明,因为工具链和操作系统已经知道main。还有其他一致性函数,如exit()。
2) 当主时间返回时,操作系统可以从中返回结果。通常非零意味着错误。因此,当你使用脚本或其他程序调用你的程序时,例如main()函数,你可以检查它是否成功。
3) 返回零以外的值表示错误。但实际上,你可以按照自己的意愿来解释这个值。但正如我所说,操作系统可以得到结果。
其他信息:main()实际上并不是启动程序时调用的第一个函数(您已经编写)。但实际上,操作系统和工具链在您的主界面、设置环境、进行初始化或其他操作之前为其他调用提供了便利。但是,当你编写代码时,你并不直接知道这一点,你根本不必处理和思考这一点。在嵌入式系统中,通常会调用一些非常低级别的函数来设置CPU主时钟、中断、堆栈等。一些像IAR这样的工具链实际上可以让你在调用main之前执行自己的代码。
希望这能有所帮助:)
函数不必首先声明为原型。只有当我们需要在定义函数之前使用它时,才需要这样的声明。
根据定义,main的类型为int。
从main返回的值的含义是常规的。普遍接受的惯例是0被认为是成功的,而不是0某种失败。
当我们运行C程序时,计算机的控制权移交给C程序main()函数,从那里C程序开始执行