为什么在C中写这么多不同类型的main()

时间:2015-11-30 17:05:12

标签: c

我看到不同的人为声明main()

而编写不同的语句

像,

int main()

void main()

int main(void)

int main(int argc, char* argv[])

我的意思是什么时候传递参数?有什么需要呢?何时将int声明为返回类型且何时为void?

当我看到人们编写不同的main()声明时,我刚刚开始练习编码,我实际上感到困惑。

5 个答案:

答案 0 :(得分:3)

如果希望程序从命令行获取某些数据,则需要输入参数。例如,您可以在命令提示符

中运行这样的smth
./test arg1 arg2

如果你int main( int argc, char* argv[] )声明你将获得argc = 3而argv是一个代表每个元素{char,arg1,arg2}的字符数组。

如果您不希望编程获取任何用户控制台输入,只需将其声明为int main( )

main视为程序的入口点,即执行发生的位置。在某些嵌入式平台上,您可以根据自己的喜好命名输入点(即int superPuperMain())。

当您从某个脚本启动程序并且您对它的返回代码感兴趣时,会处理main的返回代码。将您的程序视为具有返回代码的函数。当然这不正确,但它给你一个普遍的感觉:)。

答案 1 :(得分:2)

int main()表示您将使用return 0;结束您的程序(或其他值,0表示“一切正常”)。

  • void main()将不会返回任何内容。
  • int main(void)表示没有参数。
  • int main(int argc,char *argv[])表示有两个参数,一个是int类型,另一个是char类型指针数组。第一个参数存储输入的命令行参数的数量,第二个参数用于存储参数。

答案 2 :(得分:0)

来自C标准:

  

5.1.2.2.1程序启动   程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该使用返回类型int和no来定义   参数:
  int main(void){/ * ... * /}
  或者有两个参数(这里称为argc和argv,但任何名称都可以   使用,因为它们是声明它们的函数的本地):
  int main(int argc,char argv []){/ ... * /}
  或等效的; 10)或其他一些实施定义的方式。

所以为了回答你的问题,你写的第一个和第三个表格是相同的(写入void,因为参数列表是来自Kernigan和Richie的C的遗迹,它可以防止声明中未指定的参数列表。在那些日子里,空参数列表允许任意呼叫网站上的参数列表。)

第二个是实现定义,你错过了指定参数(argcargv)的最后一个参数,这些参数填充了程序执行时提供的参数。

答案 3 :(得分:0)

这"主要风格"取决于您使用的编译器。 每个程序在程序退出时返回退出代码。 (当程序退出时没有错误,它是0代码),所以它是int。 (但是在主 - 空的情况下意味着相同;)) 参数可选地传递,例如: - 使用命令行中的一些参数运行yourprogram.exe,现在可以读取这些参数。

答案 4 :(得分:0)

主函数在_start中定义(在POSIX / UNIX操作系统上)。编译器查找_start符号然后跳转到它。 _start然后调用main。 main以这么多方式编写的原因是对main的调用非常模糊。我将解决这些以及其他几个问题 让我们从main()开始     仅当在标头中定义main并且其类型已设置时,才会发生这种情况。
现在让我们解决int main()
这是你想要一个返回值,所以操作系统或shell可以检测是否发生了错误,例如make查看是否返回-1,然后如果返回则停止执行。
当你不想要一个返回值时,使用void main(),通常是一个简单的程序 int main(void)与刚刚以不同格式编写的int main相同。
现在让我们解决争论 还有另一种方法可以编写main,即:int main(int argc,char * argv [])
当您要查找要传递给函数的命令行参数时,将使用此方法。 argc是参数的数量(包括命令),argv []是参数。例如,如果运行./a.out,argc将为1,argv将为[0] a.out。如果你运行./a.out foo argc将是2而argv将是[0] a.out,[1] foo。