首先,需要明确main函数是什么?

答:main函数是C语言约定的入口函数

C99标准里面是这样描述的:

Program startup

The function called at program startup is named main.The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

int main(void) { /*...*/ }

or with two parameters (referred to here as argc and argv,though any names may be used, as they are local to the function in which they are declared):

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

同时,规定了main函数的两种常见形式:

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

对于第一种形式大家经常用到,而第二种情况中的参数用法,可能关注的不太多,下面我们会进一步提及。

关于将main函数约定为入口函数(即:执行入口)的提法,MSDN上也有提到:

A special function named main is the starting point of execution for all C and C++ programs. If you are writing code that adheres to the Unicode programming model, you can use wmain, which is the wide-character version of main.

地址:https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

从上面的讨论,可以知道main函数是约定入口函数,那么标题“为什么需要main函数”,可以引申为“为什么需要入口函数”。

这个问题其实不好回答,想详尽的了解,可以参考《程序员的自我修养》。

知乎上有一篇文章《C语言为什么要有 main 函数?具体作用是什么?》,大家可以参考。

地址:

http://www.zhihu.com/question/28360770

我们这里只是浅显的回答,其中知乎上有一个简单的回答,虽然不是太深入,但是相对比较直观。

作者:Ivony,,,,

地址:http://www.zhihu.com/question/38055198/answer/74753788

这是个好问题,但是这个问题恐怕比你想的水深得多。

C++程序以main函数为入口这个说法严格来说并不正确。

我这里不展开,只简单的谈谈。

要解决这个问题,我们先要看所谓的入口是什么意思,到底有什么用处。

一个程序需要怎么运行呢?在Windows上就是编译成一个exe文件,然后双击,Windows就会帮你运行这个文件。Windows怎么知道怎么去运行这个文件?这么一大堆代码应该从哪里开始执行?就需要这个文件提供一个所谓的入口,操作系统(或者说启动器)从这个入口开始执行程序。

在这个例子里面,Windows就是这个程序的宿主/启动器,这个宿主/启动器要求程序需要一个入口也就是main函数。

在这里,大家可以回想现实生活中的现象,比如景点为何要设置“景区入口”?

请思考

只有规定了“景区入口”,游客才知道从哪进入;

只有规定了“景区入口”,景区才方便统一收费,统一安检, 统一各种管理等等

说到这里,其实我想说一下讨论该问题的初衷:

为了说明一个知识点,即我们可以在main函数,利用入口参数做一些工作,以达到控制程序行为的目的。

在int main(int argc, char *argv[]) { /*...*/ }函数 体中,argc为整型,标识参数个数;argv是指针数组,为参数列表,通常是利用argv中的参数做文章,我们看一个具体的小例子:

#include "stdio.h"

#include <string.h>

bool g_WriteLog = false;

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

{

for(int i=0; i< argc; i++)

{

if( strcmp(argv[i], "-writelog") == 0 )

{

g_WriteLog = true;

}

}

if( g_WriteLog ) //开关默认关闭

{

for(int j=0; j < 10; j++ )

{

printf("%d\t" , j);

}

}

printf("\n");

return 0;

}

编译:g++ control.c -o con

运行:./con –writelog

0 1 2 3 4 5 6 7 8 9

上述代码中,利用入口参数“-writelog”控制是否打印数字。

举个实际例子,可以通过参数,控制一组服务器的人数上限,比如你可以限制A服务器最多1000人,而限制B服务器最多2000人。

诸如此类的应用十分广泛,有时候,也会在快捷方式中包含启动参数,如下图:

点击快捷方式执行,也就相当于给main函数传入了参数。

再多说一句,main函数还可以有第三个参数:

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

感兴趣的人,可以自己搜索一下相关资料。

总之,希望上述的讨论,能引起大家一点思考,即便简单的main函数也是很有料的;同时,希望大家记住main函数参数的用法。

最后,问题的理解,需要在实践中加深;后续也请将你的理解分享给大家。

为什么需要main函数,及其参数的用法的更多相关文章

  1. main函数的参数的用法

    说明:main函数的参数的用法源代码: #include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[] ...

  2. (转)C++ main函数中参数argc和argv含义及用法

    原博地址:https://blog.csdn.net/dcrmg/article/details/51987413 argc 是 argument count的缩写,表示传入main函数的参数个数: ...

  3. C++ main函数中参数argc和argv含义及用法

    argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0 ...

  4. Atitit dsl对于数组的处理以及main函数的参数赋值

    Atitit dsl对于数组的处理以及main函数的参数赋值 1.1. 词法解析..添加了[] 方括号的解析支持1 1.2. Ast建立.添加了数组参数的支持..使用了递归下降法..getparam ...

  5. C语言中main函数的参数

    转自:http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上, ...

  6. 关于main函数传参数的问题

    argc是命令行总的参数个数      argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数      命令行后面跟的用户输入的参数,比如:      int   main(int   ...

  7. C++向main函数传递参数的方法(实例已上传至github)

    通常情况下,我们定义的main函数都只有空形参列表: int main(){...} 然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作.例如,假定ma ...

  8. 关于main函数的参数问题

    我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...

  9. C++ main函数的参数

    C++的main函数可以没有输入参数,也可以有输入参数,而且只能有两个参数,习惯上coding如下: int main(int argc, char* argv[]) 或者 int main(int ...

  10. Java中eclipse与命令行向main函数传递参数

    我们知道main函数是java程序的入口,main函数的参数类型是String[]. 1.Eclipse中向main方法传递参数 例如: public class Mytest { public st ...

随机推荐

  1. linux第12天 线程

    今天主要学习了共享内存,信号量的封装,还有线程. POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库,要通过引入头文<p ...

  2. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  3. HDU 4900 NO ACM NO LIFE(概率+枚举+搜索)(2014 Multi-University Training Contest 4)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4900 Problem Description There is an old country and ...

  4. Codeforces Round #325 (Div. 1) D. Lizard Era: Beginning

    折半搜索,先搜索一半的数字,记录第一个人的值,第二个人.第三个人和第一个人的差值,开个map哈希存一下,然后另一半搜完直接根据差值查找前一半的答案. 代码 #include<cstdio> ...

  5. 解决ScrollView与ListView事件冲突

    1,在最近做项目的时候使用ScrollView嵌套ListView的时候发现ListView的滑动效果失效,简单的网上搜索了一下,也就有了下面的解决方法,在ListView中设置事件的监听listvi ...

  6. input type=file 标签禁止让用户手动输入

    常规的Web应用程序中涉及到文件上传的部分都不可避免地会使用到<input type="file"/>控件,在上传文件的时候通过点击“浏览”按钮,在弹出的文件选择对话框 ...

  7. 夺命雷公狗ThinkPHP项目之----企业网站7之栏目的修改(主要用模型来验证字段)

    我们照老,在控制器里面先查出我们所需要用到的数据: 然后直接遍历到模版上即可: 然后再开始写提交过来的数据处理问题(注意一定要接收修改页面通过隐藏域)而且我们刚才已经写好我们的model层了,所以直接 ...

  8. Cloudera CDH 、Impala本地通过Parcel安装配置详解

    一.Parcel本地源与Package本地源的区别 本地通过Parcel安装过程与本地通过Package安装过程完全一致,不同的是两者的本地源的配置. 区别如下: Package本地源:软件包是.rp ...

  9. 【sinatra】设置默认的端口

    加入 set :port, 8888 #默认4567

  10. linux设备驱动归纳总结(十二):简单的数码相框【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...