你真的了解main函数吗?

简介: 你真的了解main函数吗?

我们每写一个C程序或者C++程序,都需要敲下这样的一个函数名main,但是为什么要有main函数?main函数真实的面容又是什么样呢?


为什么要有main函数或者main函数的作用是什么?前两天一个初学者问我问题,说他的代码报错了,没法运行,然后我定睛一看,整个代码没有main函数,所以报错了!

image.png


这个问题对于已经入门的人来说,可能不会犯,但是对于新手来说,他感觉自己照着书上的代码写的,为什么连编译都不行呢?很是郁闷啊!!并且他并不理解,为什么写了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函数参数传入进去,这些参数都是程序从外部获取的,我们只需要取出即可。当我们没有输入任何的命令行参数的时候,这个程序会输出当前进程名,因为命令行参数的第一参数是当前进程名:

image.png

使用命令行参数有什么作用?使用命令行参数可以控制程序的执行,我们的程序可能实现了很多的功能,就比如图书管理系统,有增加图书,查书籍等等不同的功能,这些功能有自己的代码段,我们如何可以定位去执行哪一段代码呢?这时候就可以利用参数的方式,我们在命令行传入的参数,就好比一个指令,在程序内部设计指令识别,然后对不同指令解析去执行不同的功能模块。那我们怎么传入命令行参数呢?


我们可以从cmd传入,将当前可执行文件完整路径输入,接着随便输几个字符串,然后看看效果,举例:

image.png

我们在此处可执行文件完整路径后面输入的,都是命令行参数!那么新的问题来了,如果我代码有问题,想调试一下,但是调试过程中没法输入命令行参数啊,毕竟命令行参数是在main函数执行之前就传入的,这时候怎么办呢?我们拿vs举例:

image.png

右键选择当前项目,点击属性,然后点击调试–>命令行参数,然后输入就可以了:

image.png

动态操作流程:

image.png

每个进程都有一个与它相关的环境块,在进程地址空间分配时候会为环境变量分配一块内存,每个字符串的第一部分是一个环境变量的名称,后跟一个等号,等号之后是希望赋给此变量的值。这种字符不能作为环境变量使用。那么怎么获取环境变量呢?

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;
}

运行效果部分图:

image.png

有关main函数的简单科普就到此结束啦!下篇博文与各位再见面喽!!!



目录
相关文章
|
6月前
|
程序员 C语言 开发者
int main() 作用详解
int main() 作用详解
369 0
|
1月前
|
编译器 C语言
2.1 main函数
在C程序中,执行总是从`main()`函数开始。`main()`函数为程序的基本模块,其返回类型为`int`,表示返回一个整数值。尽管函数名后的括号通常包含传入信息,但在本例中其为空,表明无参数传递。注意旧版C代码可能省略`int`与`(void)`,但现代标准如C99和C11不支持这种写法,因此应避免使用。
22 8
|
6月前
VS2015中main函数带参数运行
VS2015中main函数带参数运行
113 0
|
6月前
|
程序员 编译器 C语言
main函数,printf函数,和库函数
main函数,printf函数,和库函数
50 1
|
6月前
|
数据采集 Rust Java
Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
41 0
|
程序员 C语言
“main函数”以及“printf函数和库函数”的理解
“main函数”以及“printf函数和库函数”的理解
73 0
“main函数”以及“printf函数和库函数”的理解
|
Java
main参数
main参数
56 0
main参数
C#基础之Main函数
C#基础之Main函数
85 0
C#—Main方法
今天在敲委托代理第三个例子的时候遇到了这样的问题
|
编译器 C++
C++ 是否存在一个在main()主函数之前就执行的函数? 这个可以有!
C++ 是否存在一个在main()主函数之前就执行的函数? 这个可以有!
120 0