我们每写一个C程序或者C++程序,都需要敲下这样的一个函数名main,但是为什么要有main函数?main函数真实的面容又是什么样呢?
为什么要有main函数或者main函数的作用是什么?前两天一个初学者问我问题,说他的代码报错了,没法运行,然后我定睛一看,整个代码没有main函数,所以报错了!
这个问题对于已经入门的人来说,可能不会犯,但是对于新手来说,他感觉自己照着书上的代码写的,为什么连编译都不行呢?很是郁闷啊!!并且他并不理解,为什么写了main编译就通过了,但是我还是运行不出来想要的结果呢(main函数中没有调用他写的函数,也没有执行什么其它的操作),所以main函数究竟是干什么的?
我们平时见到的main函数大致是这个样子的:
int main() { ........ return 0; } void main() { ........ return; }
main函数是C语言或者C++程序的一个入口,我们需要编译生成一个可执行项目的过程中会经过好几个阶段,而在生成的可执行文件中,main函数就是它的入口,就好比我们需要盖一个房子,为了我们进出方便,肯定是有一个大门,房子里面有厨房、洗手间、卧室、书房等等的细节,但是进入房子的门只有一个!而我们想要进到房子里面去睡觉、上洗手间,需要先打开房门,对于一个exe程序来说,main函数就是它的房门,没有房门,完全密闭的一个房子,里面不管有多么的精致,你也无法享受!通过这道房门,在房子里面装上各种功能器件,那就可以享受了!所以main函数是不可或缺的程序入口,也是一切的开始。
但是我们是否又见过这样的main函数呢?
int main(int argc, char* argv[],char *envp[]) int main(int argc, char** argv,char** envp)
嗯?main函数居然还有参数?为什么我从来没见过main函数的参数啊?这些参数我们怎么获得?那参数又是怎么传到程序中的呢?
确实!main函数是有参数的,你没有看错!我来解释一下这三个参数:
第一个参数是一个整型,其中包括的是命令行参数的个数,第二参数是一个二维的char型指针,存放命令行参数字符串,第三参数是二维的char型指针,存放环境变量。那我们怎么获得命令行参数呢?写一个简答的示例代码:
int args_parse(int argc, char** argv) { //argv[0] 是当前进程名 int i = 0; while (i < argc) { printf("%s\r\n", argv[i]); i++; } return 0; } int main(int argc, char** argv, char** envp) { args_parse(argc,argv); return 0; }
我在函数args_parse中定义了两个参数,然后在main函数传参就直接把main函数参数传入进去,这些参数都是程序从外部获取的,我们只需要取出即可。当我们没有输入任何的命令行参数的时候,这个程序会输出当前进程名,因为命令行参数的第一参数是当前进程名:
使用命令行参数有什么作用?使用命令行参数可以控制程序的执行,我们的程序可能实现了很多的功能,就比如图书管理系统,有增加图书,查书籍等等不同的功能,这些功能有自己的代码段,我们如何可以定位去执行哪一段代码呢?这时候就可以利用参数的方式,我们在命令行传入的参数,就好比一个指令,在程序内部设计指令识别,然后对不同指令解析去执行不同的功能模块。那我们怎么传入命令行参数呢?
我们可以从cmd传入,将当前可执行文件完整路径输入,接着随便输几个字符串,然后看看效果,举例:
我们在此处可执行文件完整路径后面输入的,都是命令行参数!那么新的问题来了,如果我代码有问题,想调试一下,但是调试过程中没法输入命令行参数啊,毕竟命令行参数是在main函数执行之前就传入的,这时候怎么办呢?我们拿vs举例:
右键选择当前项目,点击属性,然后点击调试–>命令行参数,然后输入就可以了:
动态操作流程:
每个进程都有一个与它相关的环境块,在进程地址空间分配时候会为环境变量分配一块内存,每个字符串的第一部分是一个环境变量的名称,后跟一个等号,等号之后是希望赋给此变量的值。这种字符不能作为环境变量使用。那么怎么获取环境变量呢?
void envp_parse(char** envp) { int i = 0; char** Travel = envp; while (NULL != Travel) { if (NULL == *Travel) { printf("Envp Over!!!\r\n"); return; } else { printf("%s\r\n", *Travel); } Travel++; } } int main(int argc, char** argv, char** envp) { //args_parse(argc,argv); envp_parse(envp); getchar(); return 0; }
运行效果部分图:
有关main函数的简单科普就到此结束啦!下篇博文与各位再见面喽!!!