写C主函数

Writing C main function

本问题已经有最佳答案,请猛点这里访问。

我理解为什么C需要一个主函数来开始一个程序的执行,但是在我已经阅读了全部或部分的三本书中,没有一本书解释了为什么程序以声明main为int或以void参数开始:

主(空)

有人能告诉我这是什么目的吗?


main()的返回值用于表示其父进程的成功或失败。更一般地说,它也可以用来通信特定的状态,尽管C没有定义这些状态。

如果main()返回0EXIT_SUCCESS,则程序成功。EXIT_FAILURE或非零,则失败。

参数列表中的void简单地说它不需要参数。这是因为C的一个(mis)特性允许您声明一个函数而不完全指定它所需要的参数。声明为int func();的函数可以用任意数量的参数调用,但int func(void);只能用零调用。

例子

在Linux上,

两个小程序:

1
2
3
4
5
6
7
8
9
10
$ cat ret0.c
int main (void) { return 0; }
$ cat ret42.c
int main (void) { return 42; }

Then in `bash` we can look at
$ ./ret0 ; echo $?
0
$ ./ret42 ; echo $?
42

所以在调用程序时可以使用这个状态。


和C中的任何其他函数一样,main也是一个函数。因此它有一个返回类型,并且可以接受参数。

1
int  main(void)

这里,int是main的返回类型。许多人仍然使用"虚空",因为他们没有用当前的语言标准更新自己。哈克的回答提到指定主函数签名的最新标准。将int作为main的返回类型是它的一般和良好实践,因为它告诉main的父进程程序的终止(成功/失败)。

与其他任何函数一样,main也可以接受参数,但有一个例外,即,在程序执行开始之前,main的参数被给出。这些被称为"命令行参数"。MAIN可以通过两种方式接受参数:

1
2
3
4
5
6
7
1. int main(void)
         or
   int main()

2. int main(int argc, char *argv[])
         or
int main(int argc, char **argv)

第一个声明说main不期望任何参数,其中作为第二个声明符--操作要求用户向main提供命令行参数。

注意:main应该接受0或2个参数。如果你试图给出除这些参数之外的其他参数在编译代码时会发出以下警告

1
warning: ‘main’ takes only zero or two arguments [-Wmain]

编辑:如果使用GCC,则会显示上述警告。


首先,让我们忘掉梅因。在C(非C++)中,如果您定义了一个没有这样的参数的函数

1
int f(){ return 0;}

使用任意数量的参数调用此类函数是合法的:

1
2
int a = f(); /* legal */
int a = f("help", 1, 2.0); /* legal */

如果您希望函数f只在没有参数的情况下工作,您可以这样修改它:

1
2
3
int f(void){return 0;}
int a = f(); /* legal */
int a = f("help", 1, 2.0); /* not legal as it has too many parameters */

同样的情况也适用于main()main(void)。在大多数情况下,在合理的世界里,大多数人都不会在意,但是我在程序中遇到了称为main的法律代码。

因此,宣布main为:

1
2
3
int main() {
     /* Do a bunch of stuff here */
}

允许程序中其他地方的代码执行此操作:

1
2
main();
main(1,2,3,4);

通过声明main(void)可以添加一个编译器检查,以防止后一个示例main(1,2,3,4)编译。


int返回用于向操作系统返回错误指示。return 0表示没有错误,所有其他代码(通常是return 1表示程序无法成功完成。其他程序(如shell脚本)可以使用此错误代码来确定您的程序是执行了任务还是遇到了问题。

void只是指没有论据。它和

1
2
3
4
int main()
{
    /* program */
}

但更明确。

程序可以接受命令行参数,在这种情况下,main必须定义为

1
2
3
4
    int main(int argc /* number of arguments */, char *argv[] /* arguments)
    {
        /* program
    }

任何关于C的好书都应该解释这一点。