Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++中关于main函数的几点说明

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

作者头像
恋喵大鲤鱼
发布于 2018-08-03 08:46:41
发布于 2018-08-03 08:46:41
1.2K00
代码可运行
举报
文章被收录于专栏:C/C++基础C/C++基础
运行总次数:0
代码可运行

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

1.函数内并可以不出现return语句

当main()函数的返回值为int,而函数内并没有出现return语句时,同样可以通过编译并正常运行。这是因为编译器在main()函数的末尾自动添加了return 0;的语句。所以,main()函数是C++程序经过特殊处理的函数。其他的返回值类型不是void的函数,如果没有使用return语句,编译器将报错。

2.VS环境下mian函数的返回值可以是数值类型,如char,float,double或者long

VS环境下对main函数的返回值没有太严格的要求,只要可以强制转换为int的类型都可以作为返回值,显而易见,string是不能作为main函数的返回值。参考如下程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

char main()
{
    cout<<"Hello!"<<endl;
    getchar();
    return '0';
}

如果将返回类型换成string类型,编译不通过,读者可自行验证。当然,以上代码不具有可移植性,在Linux环境下使用g++编译不会通过,提示返回值类型必须为int,可见g++更加严格的实现C++标准的内容。

3.Windows平台,可通过环境变量errorlevel获取C++应用程序main函数的返回值

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
int main()
{
    int i;
    cout<<"please input a number"<<endl;
    cin>>i;
    return i;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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。运行截图如下:

这个实验说明了程序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()函数被称为“入口函数”,那main()函数一定是程序中的第一个被执行的函数吗?

考察如下程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
class A{
public:
    A(){
        cout<<"In default A constructor"<<endl;
    }
};
A b;
int main()
{
    cout<<"In main()"<<endl;
    return 0;
}

编译运行以上代码输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Indefault A's constructorIn main()

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

5.main()函数可以带参数

main()函数带参数是用来提供用户向程序输入参数。main()所带的参数有固定格式,即int main(int argc,char* argv[]),其中argc代表参数的个数,argv数组中的每一个元素则保存命令行参数内容的字符串。考察如下程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

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

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


参考文献

[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.1 关于main()函数(P91-P94)].

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++关于main函数的几点说明
main函数是C++程序的入口函数,C++标准规定main()函数的返回值类型为int,返回值用于表示程序的退出状态,如果返回0则表示程序正常退出,如果返回非0,则表示出现异常。C++标准规定,main()函数原型有两种:
恋喵大鲤鱼
2019/02/22
7.2K0
干货 | 深度剖析C语言的main函数
main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。
C语言与CPP编程
2020/12/10
2.3K1
干货 | 深度剖析C语言的main函数
【编程基础】你是否真的了解main()函数?
最近看到很多人、甚至市面上的一些书籍,都使用了void main() ,其实这是错误的。C/C++中从来没有定义过void main() 。C++之父 Bjarne Stroustrup在他的主页上的 FAQ 中明确地写着 The definition void main() { /* …… */ } is not and never has been C++, nor has it even been C。( void main() 从来就不存在于 C++ 或者 C )。下面我分别说一下 C 和 C++
程序员互动联盟
2018/03/13
6940
【编程基础】你是否真的了解main()函数?
C/C++代码调试的几点建议
代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。这是所有程序员必须牢记在心的一条准则。一个没有设计或者这几得很糟糕的程序,无论怎样调试,也不会成为一个合格的程序。
恋喵大鲤鱼
2018/08/03
6910
C语言的main函数到底该怎么写
main函数是程序执行自定义的第一个函数。从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本。
编程珠玑
2019/09/03
1.5K0
C语言的main函数到底该怎么写
C语言return函数
说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。
Java架构师必看
2021/03/22
3.3K0
关于main函数返回值
其他还有写成main( )、 void main( )和 int main(void),这些有什么区别对错呢。
用户6755376
2019/11/19
3.3K0
C语言 函数指针和指针函数及Main()函数
指针函数 定义 指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表)
全栈程序员站长
2022/06/25
8050
C语言 函数指针和指针函数及Main()函数
4.9 C++ Boost 命令行解析库
命令行解析库是一种用于简化处理命令行参数的工具,它可以帮助开发者更方便地解析命令行参数并提供适当的帮助信息。C++语言中,常用的命令行解析库有许多,通过本文的学习,读者可以了解不同的命令行解析库和它们在C++项目中的应用,从而更加灵活和高效地处理命令行参数。
王 瑞
2023/08/22
5250
再探函数
main:处理命令行 //main函数的两种定义形式 int main(int argc,char **argv[]) int main(int argc,char *argv[]) argc:指的是
Cloud-Cloudys
2020/07/07
4000
【寻找Linux的奥秘】第九章:自定义SHELL
Shell 是一种用于与操作系统交互的命令行界面程序。它充当用户和操作系统内核之间的中介,通过用户输入的命令来执行操作,提供与操作系统的互动。
code_monnkey_
2025/06/02
650
【寻找Linux的奥秘】第九章:自定义SHELL
【答疑释惑】main函数的参数是哪里传递来的
int main(int argc, char *argv[]) 这个参数是哪里传递来的? C/C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(int argc, char* argv[]) 这两个参数的作用: argc 是指命令行输入参数的个数(以空白符分隔) argv存储了所有的命令行参数。 1.通过命令行运行 假如你的程序是Helloworld.exe,在cmd命令行运行时,增加参数即可: Hello
程序员互动联盟
2018/03/14
1.2K0
【答疑释惑】main函数的参数是哪里传递来的
嵌入式Linux:main函数的使用方法
和单片机开发一样,在Linux中,C语言程序的执行通常从main函数开始。main函数是程序的入口点,当程序启动时,操作系统会调用main函数来执行程序的主要逻辑。
不脱发的程序猿
2024/05/26
2390
c++获取命令行参数
第一个形参必须是int(c语言规定),第二个形参必须是指向字符串的指针数组,而且main函数自身的参数值是从操作系统命令行获取的。
高久峰
2023/06/23
6400
VC 在调用main函数之前的操作
title: VC 在调用main函数之前的操作 tags: [VC++, 反汇编, C++实现原理] date: 2018-09-16 10:36:23 categories: VC++反汇编分析 keywords: VC++, 反汇编, C++实现原理, main函数调用, VC 运行环境初始化 --- 在C/C++语言中规定,程序是从main函数开始,也就是C/C++语言中以main函数作为程序的入口,但是操作系统是如何加载这个main函数的呢,程序真正的入口是否是main函数呢?本文主要围绕这个主题,通过逆向的方式来探讨这个问题。本文的所有环境都是在xp上的,IDE主要使用IDA 与 VC++ 6.0。为何不选更高版本的编译器,为何不在Windows 7或者更高版本的Windows上实验呢?我觉得主要是VC6更能体现程序的原始行为,想一些更高版本的VS 它可能会做一些优化与检查,从而造成反汇编生成的代码过于复杂不利于学习,当逆向的功力更深之后肯定得去分析新版本VS 生成的代码,至于现在,我的水平不够只能看看VC6 生成的代码 首先通过VC 6编写这么一个简单的程序
Masimaro
2018/10/10
2.5K0
VC 在调用main函数之前的操作
C语言 main 函数到底怎么写是对的?
各位,C语言中的main函数大家都再熟悉不过了,这是你学习C语言首先就要学习的东西,但是我看过很多人写的代码包括我们的一些读者在main函数的写法方面版本很多,今天就跟大家聊一聊main函数到底应该怎么写的问题。
Power7089
2020/07/26
1.5K0
c语言main函数里的参数argv和argc解析
一般我们平时写main函数的话,一般都是写不带参数的比较多,而且也习惯了这样写;其实标准的形式写法,main函数是带两个参数的,这两个参数分别是:argc和argv,那么这两个参数是表示什么意思,怎么用呢?今天就给大家分享main函数里面这两个参数的使用,下面看到这样的写法,要明白这样写的意思哦!
用户6280468
2022/03/21
3.5K0
c语言main函数里的参数argv和argc解析
main函数与命令行参数
执行程序时,可以从命令行传值给C程序。这些值被称为命令行参数,特别是想从外部控制程序,不是通过在代码内对这些值进行硬编码时,而是通过参数来控制代码部分逻辑。 int main(int argc,char *argv[]) argc:命令行参数个数(不给main()函数传递参数时默认值为1,即至少有一个参数为该可执行文件的文件名(含目录)) argv:命令行参数数组(分别指向各个字符串参数的首地址,其中argv[0]存储的是可执行文件的文件名的首地址。)
用户7272142
2023/10/11
4560
main函数与命令行参数
OpenvSwitch系列之浅析main函数
通过前面几篇解析OpenvSwitch内部主要数据结构和流程,对OpenvSwitch有了相对简单的了解,由于本人不是专业搞OpenvSwitch的,纯属业余爱好,今天可能是OpenvSwitch最后一篇了,我们要做到有始有终嘛,所以我们来分析一下main函数。然而main函数里面涉及内容比较多,而且比较深入,所以这篇文章只是浅析,不能算深入剖析,希望以后能有哪位大神能够做一个深入剖析。 自己在学习开源软件总是喜欢看一下main函数,认为不把main函数搞明白了,就不算一个好程序员!!其实把main函数搞明
SDNLAB
2018/04/03
1.8K0
OpenvSwitch系列之浅析main函数
指针数组做main函数的形参
SarPro
2024/02/20
1770
相关推荐
C++关于main函数的几点说明
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验