我看到不同的人为声明main()
而编写不同的语句像,
int main()
void main()
int main(void)
int main(int argc, char* argv[])
我的意思是什么时候传递参数?有什么需要呢?何时将int声明为返回类型且何时为void?
当我看到人们编写不同的main()声明时,我刚刚开始练习编码,我实际上感到困惑。
答案 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的遗迹,它可以防止声明中未指定的参数列表。在那些日子里,空参数列表允许任意呼叫网站上的参数列表。)
第二个是实现定义,你错过了指定参数(argc
和argv
)的最后一个参数,这些参数填充了程序执行时提供的参数。
答案 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。