C中的main()函数

几个星期以来,我一直在用自学成才的方式学习C编程,而且我对main()函数有一些问题。

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

  2. 为什么我们必须使用int main()而不是void main()

  3. 返回0在main()函数中完全做了什么? 如果我编写一个程序以return 1; main()函数,会发生什么? , 例如?

  1. 只有在使用函数之前才需要声明函数。 该定义本身就是一个声明,因此不需要先前的原型。 (如果在没有先前原型的情况下定义函数,某些编译器和其他工具可能会发出警告。这是一个有用的指导原则,而不是C语言的规则。)
  2. 因为C标准是这样说的。 操作系统将返回值传递给调用程序(通常是shell)。 有些编译器会接受void main ,但这是一个非标准的扩展(通常意味着“总是向操作系统返回零”)。
  3. 按照惯例,非零返回值表示发生了错误。 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) { /* ... */ } 

或者使用两个参数(这里称为argcargv ,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):

 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某种失败。