C中的main()函数

时间:2013-08-26 14:36:16

标签: c main

我已经用自学成才的方式学习C编程几周了,我对main()函数有一些问题。

  1. 所有函数必须在它们的函数原型中声明,然后在它们的定义中声明。为什么我们不必先在原型中声明main()函数?

  2. 为什么我们必须使用int main()代替void main()

  3. main()函数中返回0的确是什么?例如,如果我用[{1}}编写一个以main()函数结尾的程序,会发生什么?

9 个答案:

答案 0 :(得分:19)

  1. 仅在使用函数之前需要声明函数。该定义本身就是一个声明,因此不需要先前的原型。 (如果在没有先前原型的情况下定义函数,某些编译器和其他工具可能会发出警告。这是一个有用的指导原则,而不是C语言的规则。)
  2. 因为C标准是这么说的。操作系统将返回值传递给调用程序(通常是shell)。有些编译器会接受void main,但这是一个非标准的扩展(通常意味着“总是向操作系统返回零”)。
  3. 按照惯例,非零返回值表示发生了错误。 Shell脚本和其他程序可以使用它来查明您的程序是否成功终止。

答案 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) { /* ... */ }
     

或有两个参数(此处称为argcargv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

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程序本身将从此处开始执行