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

1.标准原型

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 并输入参数:

main.out LVLV
Hello LVLV

程序会将输入的参数与 Hello 打印在同一行。

使用命令行参数时注意以下几个问题:

  1. 命令行输入的程序名称为程序的第一个参数,以上程序中 argv[0 ]保存的是 main.out,尽管只输入一个参数 “LVLV”,但是参数数量 argc 包含了程序名称,因此 argc 等于 2。其他编程语言(如 C#)中,命令行参数并不包含执行文件名。
  2. 在命令行中,空格被认为是命令行参数的分隔符,也就是说同一个参数内部不允许出现空格,如果参数包含空格,使用双引号括起来,如 main.out “LVLV and JF”。

2.mian 返回值类型一定是 int 吗?

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() 函数的使用会破坏程序对对象析构函数的调用,应利用异常处理机制取代 exit() 函数。

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

4.main 是第一个被执行的函数吗?

先说结论,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++程序中第一个被执行的函数。


参考文献

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

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值