编写C主函数



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

int main(void)

有人能告诉我这是为了什么吗?

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

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

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

示例

在linux上,

两个琐碎的程序:

$ 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

因此,在调用程序时可以使用该状态。

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

void只是意味着没有争论。它与相同

int main()
{
    /* program */
}

但更明确。

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

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

任何一本关于C的优秀书籍都应该对此进行解释。

首先让我们忘记main。在C(而不是C++)中,如果你定义了一个没有参数的函数,比如这个

int f(){ return 0;}

用任意数量的参数调用这样的函数是合法的:

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

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

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类似于:

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

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

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

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

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

int  main(void)      

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

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

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

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

注意:main应该接受0或2个参数。如果您试图给出
的任意数字除了这些参数之外,当您编译代码时,它会发出以下警告

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

编辑:如果您正在使用gcc,则会显示上述警告。

相关内容

  • 没有找到相关文章