首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我们需要在C++中使用`int main`而不是`void main`?

在C++中,int mainvoid main都是合法的,但它们有不同的含义。

int main是C++中主函数的标准定义,它表示主函数的返回值类型是整数。在C++中,程序的主函数是程序的入口点,它是程序执行的第一个函数。程序的主函数通常负责处理命令行参数、初始化程序和调用其他函数。当程序的主函数返回一个整数时,该整数被视为程序的退出状态。通常,返回0表示程序成功执行,而返回非零值表示程序执行过程中出现错误。

void main是C语言中主函数的标准定义,它表示主函数没有返回值。在C++中,使用void main作为主函数的定义是不正确的,因为C++要求主函数返回一个整数类型的值。

因此,在C++中,我们需要使用int main而不是void main,以确保程序的正确性和兼容性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么int main()不是void main()

C/C++ 小误区:void main() 这是基于我们学校老师一直使用void main(),发的感慨,大一学习C语言时,我就在想,老师上课演示的为什么一直用void main(),不是int main...其实,当前,很多人甚至市面上的一些书籍,都使用void main( ) ,其实这是错误的,C/C++从来没有定义过void main( ), C++ 之父本贾尼·斯特劳斯特卢普 在他的主页上的FAQ...main函数的返回值应该定义为int类型,C和C++标准中都是这样规定的虽然在一些编译器void main可以通过编译(如vc6),但并非所有编译器都支持void main,因为标准从来没有定义过...void main如果main函数的返回值不是int类型,就根本通不过编译发出警告,所以,如果你想你的程序拥有很好的可移植性,请一定要用int main 4.返回值的作用 main函数的返回值用于说明程序的退出状态如果返回...那么 int mainint argc, char *argv[], char *envp[] ) 呢? 这当然也不是标准 C/C++ 里面定义的东西!

3.4K70

C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?

开场 前段时间我在知乎回答了这样一个问题: 为什么C++单例模式不能直接全部使用 static变量和 static函数呢?如果全部使用 static的话,是不是也不会有多线程的问题了?...也就是说无需我们自己写加锁保护的代码,编译器能够帮我们做到。 ⛔ 所以C++程序员们不要在读完Java单例模式的资料之后,在C++程序写double check或volatile了!...这时候两个单例在不同文件各自实现,很有可能在日志管理器的单例使用配置文件单例的时候,配置文件的单例对象是没有被初始化的。...这个未初始化可能产生的风险指的是C++变量的未初始化,不是说配置文件未加载的之类业务逻辑上的未初始化导致的问题。...讲到这,我们对Meyers' Singleton的盲目鼓吹也冷静一下,因为C++同样能保证所有文件内(非函数内)的static变量在main()函数开始运行之后肯定是都能做完初始化的。

1.1K20

C和C++混合编译,extern和extern C

假如某个函数的原型为void foo(int x, int y);该函数被C编译器编译后在符号库的名字为_foo,C++编译器则会产生_foo_int_int之类的名字。...extern “C”的惯用法:  (1) 在C++引用C语言中的函数和变量,在包含C语言头文件时(假设为cExample.h),进行以下处理:  extern "C" { #include... extern "C" void Test(void) 则和C编译器一样为_Test。 主要用于在C++代码调用的C函数的声明,或C++编译的函数要在C调用。...也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名不是...第二,当extern不与"C"在一起修饰变量或函数时,如在头文件: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用

3.3K11

C++和java多态的区别

我们先来看一下在C++的函数调用方式: Ø 普通函数调用:具体调用哪个方法在编译时间就可以决定(通过查找编译器的符号表),同时在使用标准过程调用机制基础上增加一个表示对象身份的指针(this指针)。...唔,你要说了,好象差不多嘛,不是都要维护一张函数表吗?别急,让我们先看一下例子,这样你就能更好的理解它们之间的区别到底有多大了。...C++只有在构造完毕后(所有的构造函数都被成功调用)才存在,其函数表和对象的实际类型才会确定。所以这两个例子的执行结果会不一样。...试问,如果初始化要在构造时完成,并且初始化逻辑比较复杂,派生类也需要额外的初始化,派生类是不是需要重新实现基类的初始化函数呢?这样的面向对象方法好不好呢?欢迎大家讨论。...再次注意Parent p=new Child();这条语句,它是用父类的引用指向子类的对象,前面已经说过变量只会被隐藏不会被覆盖,所以这时的p.x值应该是父类的10,不是子类的9;

90110

C++基础 指针使用注意

手动分配手动回收 程序在运行的时候需要内存,在c/c++,栈上的内存(如函数的局部非静态变量)在使用完之后,操作系统会帮我们自动回收,通过动态分配得到的 堆上的内存 ,需要手动释放。...注意,野指针不是NULL指针, 它比NULL指针更容易犯错,因为它不能通过形如 if (NULL == p)的判断语句来预防,只能我们自己在写代码时多注意。...指针定义后未初始化 指针定义后,在使用前,需要初始化,否则也是野指针,指向不确定: #include using namespace std; int main(void) {...建议:不要在函数返回局部变量的地址,如果必须返回局部变量的地址,则局部变量申明为static类型(static变量的生存期是整个程序运行期间) 其它异常导致的内存无法释放 即使在malloc/new...更好的解决方法是使用 智能指针。 建议:C++代码代码多注意使用智能指针。 参考:https://mp.weixin.qq.com/s/I3hqH0zPcSctlR6b0Sn1qA

69710

《挑战30天C++入门极限》C++面向对象编程入门:构造函数与析构函数

一个类可能需要在构造函数内动态分配资源,那么这些动态开辟的资源就需要在对象不复存在之前被销毁掉,那么c++类的析构函数就提供了这个方便。   ...我们前面例子的Teacher类中就使用new操作符进行了动态堆内存的开辟,由于上面的代码缺少析构函数,所以在程序结束后,动态开辟的内存空间并没有随着程序的结束小时,如果没有析构函数在程序结束的时候逐一清除被占用的动态堆空间那么就会造成内存泄露...但是细心的人会发现,我们在这里使用的初始化方式并不是在构造函数内进行的,而是在外部进行初始化的,的确,在冒号后和在构造函数括号内的效果是一样的,但和teacher(temp)所不同的是,pk(pk)的括号不是调用函数的意思...,而是赋值的意思,我想有些读者可能不清楚新标准的c++对变量的初始化是允许使用括号方式的,int a=10和int a(10)的等价的,但冒号后是不允许使用=方式只允许()括号方式,所以这里只能使用pk...类成员的构造是按照在类定义的顺序进行的,不是按照构造函数说明后的冒号顺序进行构造的,这一点需要记住!

63130

iOS底层原理总结 - 探寻block的本质(一)

有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMutableArray,不需要添加__block?...__main_block_impl_0函数传入的是(void *)__main_block_func_0,也就说将我们写在block块的代码封装成__main_block_func_0函数,并将_..._0类型结构体,但是我们发现__main_block_impl_0结构体并不直接就可以找到FunPtr,FunPtr是存储在__block_impl的,为什么block可以直接调用__block_impl...重新生成c++代码看一下内部结构两个参数的区别。 ? 局部变量c++代码 从上述源码可以看出,a,b两个变量都有捕获到block内部。但是a传入的是值,b传入的则是地址。...c++代码 上图中可以发现,即使block中使用的是实例对象的属性,block捕获的仍然是实例对象,并通过实例对象通过不同的方式去获取使用到的属性。

1K41

【编程基础】extern C的用法解析

例如,假设某个函数的原型为: void foo( int x, int y );   该函数被C编译器编译后在符号库的名字为_foo,C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同...例如,在C++,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。   ...我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):   实现C++与C及其它语言的混合编程。...明白了C++extern "C"的设立动机,我们下面来具体分析extern "C"通常的使用技巧。...(2)在C引用C++语言中的函数和变量时,C++的头文件添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++定义的extern "C"

95230

C++打怪升级(八)- 泛型编程初见

基于类似这样的原因,C++提出了泛型编程的概念,我们只需要写出一个函数模板不是具体的函数,我们直接使用这个函数模板,具体的函数由编译器自动生成; ---- 泛型编程是啥 编写与类型无关的通用代码,是代码复用的方法之一...main() { int a = 1; double b = 3.14; Add(a, b); return 0; } 解决方法1:具体函数由我们指定不是由编译器推导,不过这样会发生隐式类型转换...,优先调用具体函数不是函数模板; 如果我们显式使用函数模板生成的具体函数也可以正常运行得到结果; 这说明我们实现的具体函数和函数模板推导生成的具体函数是不同的函数,函数地址不同; 即我们写的具体函数与函数模板推导生成的具体函数的函数名修饰规则是不同的...,比如既需要int型有需要float型时 typedef只能满足其中一种类型,不是多种; 类模板随之而来,利落的解决了这个问题,达到了我们想创建哪个类型的类都可以的目的。...或者说为什么我们需要指定类模板实例化的类型不是像函数模板实例化那样由编译器推导类型再实例化呢?

76720

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

void test(int *p) {   int a=1;   p=&a;   cout<<p<<" "<<*p<<endl; } int main(void) { int...new是C++运算符,malloc()是C/C++语言标准库函数 new会自动计算分配的空间,malloc不行 new会调用构造函数,malloc不会 new是类型安全的,malloc...内存泄漏一般是指堆内存的泄漏,也就是程序在运行过程动态申请的内存空间不再使用后没有及时释放,导致那块内存不能被再次使用。 20、什么函数不能声明为虚函数?构造函数为什么不能为虚函数?...在C,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。...好了,今天就到这里,我们就先整理前40道C++基础闯关,大家答对了多少道呢?明天我们继续努力! ? 创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

1.8K20

C语言return函数

很多人甚至市面上的一些书籍,都使用void main( )这一形式 ,其实这是错误的。 C/C++ 从来没有定义过void main( ) 。...C++   C++ 98 定义了如下两种 main 函数的定义方式:   int main( )   int main( int argc, char *argv[] )   (参考资料:ISO/IEC...关于 void main 在 C 和 C++ ,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。...g++ 3.2 如果 main 函数的返回值不是 int 类型,就根本通不过编译。 gcc-3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main 。 4....char*envp[](Linux C的) 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用

3.2K10

C++是如何调用C接口的?

前言 如何在C++代码调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。 C++如何调用C接口 为什么会有这样的情况呢?...想象一下,有些接口是用C实现的,并提供了库,那么C++该如何使用呢?我们先不做任何区别对待,看看普通情况下会发生什么意想不到的事情。...为什么会找不到呢?现在你还会认为C++直接就可以调用C接口了吗? 真相 我们都知道,C++函数支持重载,C并不支持。...很显然,我们必须告诉链接器,这是一个C接口,不是C++接口,所以需要加入 extern C,我们修改test.h #include extern "C"{ void testCfun...博客:https://www.yanbinghu.com 问题 为什么我们C++代码可以直接调用一些标准C库函数呢?即使你在main函数调用printf等函数,它也不会出现链接错误。

1.1K30

C++是如何调用C接口的?

前言 如何在C++代码调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。 C++如何调用C接口 为什么会有这样的情况呢?...想象一下,有些接口是用C实现的,并提供了库,那么C++该如何使用呢?我们先不做任何区别对待,看看普通情况下会发生什么意想不到的事情。...为什么会找不到呢?现在你还会认为C++直接就可以调用C接口了吗? 真相 我们都知道,C++函数支持重载,C并不支持。...很显然,我们必须告诉链接器,这是一个C接口,不是C++接口,所以需要加入 extern C,我们修改test.h #include extern "C"{ void testCfun...博客:https://www.yanbinghu.com 问题 为什么我们C++代码可以直接调用一些标准C库函数呢?即使你在main函数调用printf等函数,它也不会出现链接错误。

1.4K10

C++函数论

引 关于C++的函数有很多知识,因为其函数有多种变体,可以说C++创作者为了开发方便,打开了很多个后门让编程人员随心所欲地炫技使用,但私以为这也造成了使用函数时的复杂度,如果真的在代码中使用各种变体,虽然确实可以让代码看上去简洁高级...为什么要用原型?...看过c/c++代码的人都知道,其代码大都有个main函数,而且一般都放在最前面,而其余自定义的函数都放在后面,这就导致如果你要在main函数调用一个自定义函数,此时因为你的自定义函数是在后面定义的,编译器不懂你的调用语句...,因此我们要在main函数之前声明一个函数原型,表明函数的返回值类型、函数名、参数类型、参数名,如下: void swap (int a, int b); int main (void) { int...但是我们也可以直接传递原本的变量本身,这可以通过传递指针或者变量引用来做到: // 指针 void swap (int * a, int * b); // 引用 void swap (int & a,

30610

【编程基础】你是否真的了解main()函数?

最近看到很多人、甚至市面上的一些书籍,都使用void main() ,其实这是错误的。C/C++从来没有定义过void main() 。...( void main() 从来就不存在于 C++ 或者 C )。下面我分别说一下 C 和 C++ 标准main 函数的定义。 1. C语言 在 C89 main() 是可以接受的。...-9-01)Programming languages — C++ 3.6 Start and termination) int main()等同于 C99 int main(void);int...虽然在一些编译器void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准从来没有定义过 void main .g++3.2 如果 main 函数的返回值不是...其他情况 除了以上提到的那些,还有出现 int main(int argc, char *argv[], char *envp[]) 这当然也不是标准 C/C++ 里面定义的东西!

62260

C++C++入门必备知识详细讲解

,结构体的域作用限定符是要在 ListNode 前使用不是在 struct 前使用;嵌套使用 namespace 是从右往左看,到指定的命名空间中去寻找; 虽然这种方法可以有效避免命名冲突问题,但是每次用的时候都要在前面加上域作用限定符...二、了解 C++ 的输入和输出 首先我们先要知道,C++引入了不同于C语言的输入和输出,在C语言中我们使用 scanf 和 printf 作为输入和输出,但是在C++中了 cout 标准输出对象(控制台...最后,我们要注意缺省参数不能在函数声明和定义同时出现,如果在函数声明和函数同时出现,我们只需要在声明给缺省值即可。 四、函数重载 1....a 和 b 的值;在C++我们可以使用引用完成同样的交换,代码如下: void Swap(int& p1, int& p2) { int tmp = p1; p1 = p2;...除此之外,传引用传参最舒服的地方还是在我们以前学过的单链表,如往期博客 单链表 ,无论是头插还是尾插等等操作,都需要传二级指针才能改变链表的整体结构,C++引入了引用之后,就不需要传二级指针了,如下代码

9310

C++ 结构体转json

您需要将声明结构体的头文件添加在behavior.h,并且behavior.h有事先写好的两个宏定义,如果您有使用到结构体类型作为结构体成员的序列化,无论是单个结构体还是vector,都需要在两个宏定义添加对应的定义...test.h头文件,以及main.cpp的相关测试。...虽然C++不支持反射,但是我们依旧可以通过自己的方式实现序列化与反序列化,记得我在大二时用C++写的一个client-server小项目,自己规定了传输的数据格式(当时觉得自己解析Json很麻烦),第一个字段应该是什么...,大多数人使用JSON和XML这两种数据格式来保存对象,如果我的项目想要使用这种大众化的数据格式,我又将重构我的代码。...,开启后将根据模糊等级进行匹配 暂无 你可能会有如下疑问: 为什么char * 类型算作基础类型 因为json除了数值型数据,剩下的便是字符串类型,考虑到字符串使用的频率,再加上C++对于C兼容的原因

1.4K10
领券