1.main() 函数的标准原型

main() 函数是 C++ 程序的入口函数,C++ 标准规定 main() 函数的返回值类型为 int,返回值用于表示程序的退出状态,返回 0 表示程序正常退出,返回非 0,表示出现异常。C++ 标准规定,main() 函数原型有两种:

//第一种
int main();//第二种
int main(int argc,char* argv[]);
int main(int argc,char** argv);

当 main() 函数的返回值为int,而函数内没有出现 return 语句时,同样可以通过编译并正常运行。这是因为编译器在 main() 函数的末尾自动添加了return 0;语句。所以,main() 函数是 C++ 程序经过特殊处理的函数,其他的返回值类型不是 void 的函数,如果没有使用 return 语句,编译器将报错。虽然编译器会隐式添加return 0;,但还是建议开发人员避免使用这条规则,因为显示添加可避免出错时无法返回错误码,并且不会误认为 main() 函数可以没有 return 语句。

带参的 main() 函数可以提供用户向程序输入的参数,例如int main(int argc,char* argv[]),其中,argc 代表参数的个数,argv 数组中每一个元素用于保存命令行参数的内容。考察如下程序:

#include <iostream>
using namespace std;int main(int argc,char* argv[])
{if(argc>1){cout<<"Hello "<<argv[1]<<endl;   }return 0;
}

假设此程序经过编译之后生成的main.out,那么在控制台输入”main.out LVLV”,会输出“Hello LVLV”。使用命令行参数时注意以下几个问题:
(1)命令行输入的程序名称为程序的第一个参数,以上程序中argv[0]保存的是main.out,尽管输入的只有一个参数”LVLV”,但是参数数量argc包含了程序名称,因此argc等于2。在其他编程语言(如C#)中,命令行参数并不包含执行文件的名字。
(2)在命令行中,空格被认为是命令行参数的分隔符,也就是说同一个参数内部不允许出现空格,如果在一个参数中出现空格,可以使用双引号括起来。如输入main.out “LVLV and JF”。

2.VC++ mian() 函数的返回值可以是任意数值类型

VC++下对 main() 函数的返回值没有太严格的要求,只要可以强制转换为 int 的类型都可以作为返回值,例如char,float,double或者long。参考如下程序。

#include <iostream>
using namespace std;char main()
{cout<<"Hello!"<<endl;return '0';
}

以上程序可正常编译并运行。显而易见,string 是不能作为 main() 函数的返回值。如果将返回类型换成 string 类型,编译将报错,读者可自行验证。当然,以上代码不具有可移植性,在 Linux 环境下使用 g++ 编译不会通过,提示返回值类型必须为 int,可见 GNU C++ 更加严格地实现了 C++ 标准的内容。

3.Windows平台可通过环境变量 errorlevel 获取 main() 函数返回值

依据返回值作出不同的响应。编写如下程序:

#include <iostream>
using namespace std;
int main()
{int i;cout<<"please input a number"<<endl;cin>>i;return i;
}

此程序编译生成main.exe然后编写一个批处理文件test.bat,内容如下:

@echo off
main.exe
if %errorlevel%==3 echo third
if %errorlevel%==2 echo second
if %errorlevel%==1 echo first

当我们运行此批处理文件,从控制台输入1,得到first,输入2,得到second,输入3,得到third。运行结果如下:

C:\Users\dablelv>test.bat
please input a number
2
second

这个实验说明了程序main.exe运行时,main()函数的返回值被存放在环境变量errorlevel中,我们可以在批处理文件中利用这个返回值采取不同的行动。

在main()函数中,将语句return i;改成函数调用exit(i);,这个程序的执行结果不发生变化。exit(i)的执行效果是返回操作系统,并将i作为程序的返回结果。exit用于结束进程,返回进程结束代码给操作系统,return用于结束函数调用,返回函数结束代码给调用者。在main()函数中,return和exit均可结束程序,返回结果给操作系统。在C语言程序中,当程序出现无法恢复的错误时,就可以使用exit()函数退出程序。但是在C++程序中,exit()函数的使用会破坏程序对对象析构函数的调用。在C++程序设计中,应利用异常处理机制来取代对exit()函数的调用。

关于批处理文件的几点说明:
(1)@符号出现在命令前表示关闭命令回显,即执行命令时,控制台不会出现命令的具体内容,只会出现命令的执行结果;
(2)echo off这条命是关闭所有命令回显,加上@符号表示关闭本条命令回显;
(3)%a% 这种形式 ,表示对变量a的引用。

4.main()函数不一定是程序中第一个被执行的函数

考察如下程序:

#include <iostream>
using namespace std;
class A
{
public:A(){cout<<"In default A's constructor"<<endl;}
};
A b;
int main()
{cout<<"In main()"<<endl;return 0;
}

编译运行以上代码输出:

In default A's constructor
In main()

在这个程序中,先输出“In default A’s constructor”,然后输出的是“In main()”。可见,对象a的构造函数是先于main()函数执行的。实际上,所有外部对象的构造函数都是先于main()函数执行的。如果要对类中的成员对象进行初始化,那么这些对象的构造函数也是在main()函数之前执行的。如果在这些构造函数中还调用了其他函数的话,就可以有更多的函数先于main()函数之前运行。因此main()函数不一定是C++程序中第一个被执行的函数。


参考文献

[1] 陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.1 关于main()函数(P91-P94)].
[2] 李健.改善C++程序的150个建议[M].建议0:不要让main函数返回void

C++ 关于 main 函数的几点说明相关推荐

  1. Java的IDEA最常用快捷键汇总+快速写出Main函数

    前言 IDEA可以说是当下Java程序员日常开发的神器,但是想要发挥这款神器的牛逼威力,必须得熟练使用它的各种快捷键才行.本篇总结下使用IDEA(也就是IntelliJ IDEA )进行日常开发中最常 ...

  2. linux 为什么 c语言,为什么C程序里一定要写main函数

    为什么C程序里一定要写main函数 一. 学习过程 编写程序f.c: 对其进行编译,正常通过,再对其进行连接,出现错误: 显示的出错信息为: 翻译成中文是:在c0s模块没有定义符号'_main'. 那 ...

  3. 单片机如何从上电复位执行到main函数?

    目录 1.启动文件 2.系统初始化过程 3.全局变量的初始化 从事嵌入式开发的伙伴可能会思考过一个问题,我们一般都是使用芯片厂商提供的驱动库和初始化文件,直接从main函数开始写程序,那么系统上电之后 ...

  4. main函数参数,在VS中向命令行添加参数的方法

    问题描述 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数"-a"选项执行加法,"-s"选项执行减法,"-m"选 ...

  5. 【FFmpeg】ffmpeg工具源码分析(一):main函数

    ffmpeg工具经常用来转换.生成媒体文件,下面是它的源码分析(一):main函数 ffmpeg版本:4.2.1 int main(int argc, char **argv) {int i, ret ...

  6. java用if语句调用方法_J2SE中main函数中的if语句想要调用另一个类的方法怎么能实现?...

    日常生活中,要完成一件复杂的功能,我们总是习惯把"大功能"分解为多个"小功能"以实现.在C++程序的世界里,"功能"可称呼为"函数 ...

  7. 为什么Python没有main函数?

    作者 | 豌豆花下猫 来源 | Python猫(ID:python_cat) 众所周知,Python中没有所谓的main函数,但是网上经常有文章提到" Python的main函数" ...

  8. 为什么 Python 没有 main 函数?

    作者 | 豌豆花下猫 来源 | Python猫(ID:python_cat) 众所周知,Python中没有所谓的main函数,但是网上经常有文章提到" Python的main函数" ...

  9. Android Studio编写运行测试纯java代码可带main()函数

    问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...

  10. 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?

    但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数. 那么main函数一共有多少个版本呢? 1.ma ...

最新文章

  1. c语言一维数组逆序输出_剑指信奥 | C 语言之兵人来袭!
  2. 【Python学习系列二】Python默认编码和Eclipse环境的冲突问题
  3. AddTransient、AddSingleton、AddScoped 三者都应该在什么场景下使用
  4. 第四十九期:化繁为简的五种码农必备工具
  5. 2019 美赛 A题
  6. windows安装VS2015
  7. 字符与字节有什么区别
  8. 什么是SRE?SRE需要具备什么能力?
  9. appcan ajax mysql_AppCan里面的Ajax通信实例
  10. 报表类-金蝶K3一次查询所有供应商采购价格
  11. 天创速盈:拼多多推广效果不好,哪里需要改善?
  12. Unity下SpriteSheet 使用
  13. 浏览器的三个精度Bug
  14. 互联网晚报 |12/8 星期四| 购火车票乘车将停止查验核酸证明;iPhone 15折叠屏渲染图曝光;前三季度京津冀经济持续恢复...
  15. Web实现前后端分离,前后端解耦
  16. 软件工程小组第十次会议记录
  17. 【POI框架实战】——POI设置Excel单元格格式
  18. java 将字符串数组清空_在Java中如何将字符串集转换为字符串数组
  19. css图片自适应容器大小 完整展示
  20. vue+springboot社区志愿者报名网站-源码Lw

热门文章

  1. 如果外卖APP想窃听我,有几个骚操作?
  2. 99%的程序都没有考虑的网络异常
  3. virt-install选项详解
  4. 嵌入式linux 项目开发(一)——HTML编程
  5. 基于python的web应用(二)
  6. web:网站性能工具Yslow
  7. Ubuntu 12.04下关闭图形界面知识整理-转
  8. LeetCode 29. Divide Two Integers
  9. 【操作系统】对换、分页和分段方式-思维导图
  10. 学霸的迷宫-蓝桥杯算法提高-广搜 bfs 经典问题