关于main函数

摘要:
还有专业环境中的程序,如机器人的控制芯片,也可以没有main函数。不是说不准别人调用main函数吗。命令行中的命令就是可执行文件的文件名,其后所跟参数需用空格分隔,并为对命令的进一步补充,也即是传递给main函数的参数。对main函数来说,它的参数argc记录了命令行中命令与参数的个数,共6个,指针数组的大小由参数argc的值决定,即为char*argv[6]。不过,我们最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。

main函数在一般的程序中是必须的但是也有例外:比如windows中编写的动态链接库(dll)模块。这是其他windows程序可以是用的代码,不属于独立的程序,所以可以不要main。还有专业环境中的程序,如机器人的控制芯片,也可以没有main函数。

那么main函数的参数又是个什么问题呢?不是说不准别人调用main函数吗。原来这个参数只能从本程序外的传参来。

mian函数的带参形式为

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

从函数参数的形式上看,包含一个整型和一个指针数组。当一个C的源程序经过编译、链接后,会生成扩展名为.EXE的可执行文件(对windows操作系统而言),这是可以在操作系统下直接运行的文件,换句话说,就是由系统来启动运行的。对main()函数既然不能由其它函数调用和传递参数,就只能由系统在启动运行时传递参数了。在操作系统环境下,一条完整的运行命令应包括两部分:命令与相应的参数。其格式为:命令 参数1 参数2.... 参数n ¿

此格式也称为命令行。命令行中的命令就是可执行文件的文件名,其后所跟参数需用空格分隔,并为对命令的进一步补充,也即是传递给main函数的参数。
命令行与main函数的参数存在如下的关系:
设命令行为:program str1 str2 str3 str4 str5
其中program为文件名,也就是一个由program.c经编译、链接后生成的可执行文件program.exe,其后各跟5个参数。对main函数来说,它的参数argc记录了命令行中命令与参数的个数,共6个,指针数组的大小由参数argc的值决定,即为char*argv[6]。其中argv[0]接受的是文件名,而后面的argv[]接受的是参数。
那么命令行怎么运行一个具体的程序的呢?
1、Win + R打开运行;2、输入cmd打开命令行;3、进入到要执行的exe文件所在目录,如要要执行E:\程序设计\test.exe文件,则输入E:回车(注意:如果要更改其他盘目录必须首先进入要进入盘的根目录,例如进入E盘则输入E:不用输入cd E:)进入E盘根目录,再输入cd E:\程序设计 则进入了当前目录,最后就可以输入参数了。
这里的参数又是怎么用的呢?我们可以再程序中调用这个参数,比如说设置一个密码:password。
当输入命令为 program password 参数 参数时,argv[1]保存的就是password。我们可以在程序中增加这样一个语言:
if(strcmp(argv[1]=="password"){}

这样只有命令行输入的是password时,程序才会执行。 

在 C89 标准中,main()是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 用的就是 main()。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:

  int main( void){}
 int main( int argc, char *argv[] ) {}

main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我们最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。
也就是说在最新的C语言标准中强制要求main函数的返回值类型为int,main函数的返回值是传递给操作系统,让操作系统判断程序的执行情况(是正常结束还是出现异常)

免责声明:文章转载自《关于main函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇智能小车开发的重点之电机该如何选型JS几个常用的工具函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux下生成core dump文件方法及设置【转】

转自:https://blog.csdn.net/andy31688/article/details/84493251?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source...

接口与委托

在接口中可以声明方法、属性、索引指示器和事件,接口中并不提供它们的实现。因此接口是函数成员声明的集合。如果类或结构从一个接口派生,则这个类或结构负责实现该接口中所声明的所有函数成员。一个接口可以继承多个接口,而一个类或结构可以实现多个接口。由于C#语言不支持多继承,因此,如果某个类需要继承多个类的行为时,只能使用多个接口加以说明。 委托类型,在功能上它类...

VS2010如何在同一个解决方案下建立多个项目以及切换运行不同项目

前言: 在编一些小程序时,往往我们不需要一个问题就建立一个解决方案,我们完全可以让多个项目放在同一个解决方案下,切换启动项运行即可。接下来介绍具体的步骤 一.建立空白解决方案以及添加新项目 1.先建立一个空白解决方案: 文件—新建—项目—其他项目类型——VS解决方案(自己重新起个名字确定即可)   2.接下来直接选中解决方案右键,添加项目,有的话直接添加...

linux编程lib的使用

今天由于要用到静态链接库,所以就学习了一下相关知识,总结如下:静态链接库(一般命名为libxxx.a)就是很多.o文件的集合,在你的项目中如果有一个子模快,这个子模块只是给总控模块提供一个函数接口,那么你就可以考虑把这个子模快编译成静态链接库libxxx.a,然后在总控模块中编译的时候,只需-L包含链接库所在的目录,再-lxxx引用链接库就行.当然,你也可...

Go语言之main包

Go语言的代码通过包(package)组织,包类似于其他语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个go源文件组成,目录定义包的作用。每个源文件都以一条package声明语句开始,例如package main,表示该文件属于main包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。...

iOS中Block的用法,举例,解析与底层原理

1. 前言 Block:带有自动变量(局部变量)的匿名函数。它是C语言的扩充功能。之所以是拓展,是因为C语言不允许存在这样匿名函数。 1.1 匿名函数 匿名函数是指不带函数名称函数。C语言中,函数是怎样的呢?类似这样: int func(int count); 调用的时候: int result = func(10); func就是它的函数名。也可以通...