专栏首页C/C++基础C++关于main函数的几点说明

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

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()函数参数可以用来提供用户向程序输入的参数,采用带参的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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++中关于main函数的几点说明

    main函数是C++程序的入口函数,C++标准要求main()函数的返回值类型为int。

    Dabelv
  • Golang 单引号、双引号与反引号

    单引号在 Golang 表示一个字符,使用一个特殊类型 rune 表示字符型。rune 为 int32 的别名,它完全等价于 int32,习惯上用它来区别字符值...

    Dabelv
  • Golang sync.Mutex 与 sync.RWMutex

    Golang中sync包实现了两种锁,Mutex(互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的。

    Dabelv
  • 神奇,C代码竟然能当成shell脚本一样“直接”执行!

    我们都知道,写完了的C代码是需要编译链接之后才能运行的(也许你不需要手动点击编译,但是IDE可能帮你做了这件事),那么能不能让C代码像执行shell脚本或者Py...

    编程珠玑
  • 【答疑解惑第九讲】如何在linux下面编译一个简单的c语言程序

    存在问题: 习惯了用IDE,习惯了点击执行按钮。在linux就不能这样了,该咋办? 解决方案: 随着android的大热,在linux下搞开发的人也越来越多,好...

    程序员互动联盟
  • 10个经典的 Java main 方法面试题

    在Java 7之前,你可以通过使用静态初始化运行Java类。但是,从Java 7开始就行不通了。

    哲洛不闹
  • Makefile工程管理

      假设 sequence.c 文件有修改了或者工程里面有很多的.c文件,按照上面的方式处理,工程量就很大,而且一旦有一个文件修改了,那么你就要重新再搞一遍。

    墨文
  • 10个经典的 Java main 方法面试题

    在Java 7之前,你可以通过使用静态初始化运行Java类。但是,从Java 7开始就行不通了。

    哲洛不闹
  • 你确定能把main方法解释清楚?

    main方法是我们最熟悉的方法了。从最初的开始入门Java开始就接触它了,main方法是Java程序的入口点,由Java虚拟机自动调用。因此,在很多人眼里,将m...

    用户4143945
  • python、main函数和argv参数

    笔者学习和使用过的语言中:C语言,C++语言,C#语言,Java语言都时有main函数在的,main是程序执行的起点,Python中,也有类似的运行机制,但方式...

    静默加载

扫码关注云+社区

领取腾讯云代金券