C中的main()函数

Hei*_*kki 25 c program-entry-point

几个星期以来,我一直在以自学成才的方式学习C编程,而且我对这个main()功能有一些疑问.

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

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

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

Fre*_*Foo 21

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


Yu *_*Hao 18

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

不对.简单的例子:

void foo(){}  //definition

int main()
{
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

只有在调用一个函数但尚未看到定义时,才需要声明.这将永远不会发生,main因为它是该计划的明星.


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

因为标准是这样说的.(更准确地说,它在托管环境中是正确的,通常就是这种情况)

C99 5.1.2.2.1 程序启动

在程序启动时调用的函数被命名main.该实现声明此函数没有原型.它应定义为返回类型int且没有参数:

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

或同等学历; 或者以某种其他实现定义的方式.


3)在main()函数中返回0究竟做了什么?例如,如果我编写一个以返回1结束main()函数的程序会发生什么?

返回值表示程序的结果.通常0表示成功,而其他值表示不同类型的故障.