C/C++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++ 标准中对 main 函数的定义。
1. C
在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:
int main( void )
int main( int argc, char *argv[] )
(参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)
当然,我们也可以做一点小小的改动。例如:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成别的变量名(如 intval 和 charval),不过一定要符合变量的命名规则。
如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] ) 。
main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 是 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧!不过,gcc3.2(Linux 下的 C 编译器)会在生成的目标文件中加入 return 0; 。
2. C++
C++98 中定义了如下两种 main 函数的定义方式:
int main( )
int main( int argc, char *argv[] )
(参考资料:ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination)
int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样,main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2(Linux 下的 C++ 编译器)支持。
3. 关于 void main
在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main 。
4. 返回值的作用
main 函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出,否则代表程序异常退出。下面我们在 winxp 环境下做一个小实验。首先编译下面的程序:
int main( void )
{
return 0;
}
然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为 0 。假设刚才编译好的文件是 a.exe ,如果输入“a && dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a && dir”,则 dir 不会执行。因为 && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是 int main 的好处。 如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float),重新编译后执行“a && dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a || dir 的话,则表示如果 a 异常退出,则执行 dir 。
5. 那么 int main(intargc,char*argv[],char*envp[])呢?
这当然也不是标准 C 里面定义的东西!char*envp[] 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。
到了这里,你应该了解为什么主函数定义为 int返回类型,而且函数体里面有return 0;这个语句了吧.
下面具体说说我对return的应用的理解。
只要一个函数的返回值是数字型的,那么就可以返回0(即return 0),其实你返回多少都没问题。一 般情况下,C++做出来的函数都要求返回一个值,当函数执行正常,且达到了一般情况下的目的,那么就返回0表示正确的调用了该函数,这个0就是返回给主调 函数以通知没有出错的;如果函数调用中出错,或者没有按照一般情况执行,那么就返回1,以告知主调函数采取响应策略;如果你在某个函数所在类的定义所在的 头文件中定义了一组状态值(一般都是负整数),那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误,这种情况一般用于函数功能独立性较差 的的情况。所以一般不鼓励把函数返回类型定义为void,至少返回应该是int,而在函数的最后加上return 0.语句:
int func(参数列表)
{
……
……
……
Return 0;
}
在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。
如果你定义一个函数有返回类型,可以想下面那样调用:
int func()
{
int value;
……
……
……
return value;
}
int main()
{
int intvalue;
intvalue=func();
……
……
teturn 0;
}
分享到:
相关推荐
在上述代码中,pf是一个指向函数PrintMin的指针变量,在main函数中,我们通过pf指针调用了PrintMin函数。 函数指针在C语言标准库中有很多应用。例如,C语言的快速排序库函数qsort,它使用函数指针来比较数组中的...
关于在Eclipse 下配置C /C ++ 开发环境这里不多说了。 在终端下查看C 库文件到路径: $ echo "int main() { return 0; }" > a1.c $ gcc -v a1.c #include "…" search starts here: #include <…>...
在Lua中调用C或C++函数是通过Lua的C API来实现的,这使得我们可以利用C/C++的高性能特性,同时保留Lua的易读性和灵活性。下面我们将详细探讨如何在Lua-5.2.3版本中进行这样的调用。 首先,了解Lua的C API是关键。...
此外,还需要注意不要将main函数的返回类型定义为void,应该定义为int。 头文件命名 在C++中,不要#include ,不要#include ,因为它们已经被C++标准明确的废弃了。应该改为#include 和#include 。规则是:如果这...
4. **main函数的返回类型**:main函数必须有返回类型`int`,即使有些编译器允许设置为`void`,但这不符合标准。例如`void main()`和`main()`都是错误的写法。 5. **预编译头文件**:在VC++中,`#include "stdafx.h...
而在汇编中,函数名保持原样,因此需要告诉C++编译器使用C语言的命名规则。例如,一个汇编函数`asmfunc`在C++中声明和调用的方式如下: ```cpp extern "C" { extern int asmfunc(int a); // 声明外部汇编函数 } ...
- **main函数**:每个C/C++程序的入口点。 5. **内存管理** - **栈内存**:自动分配和释放,存储局部变量。 - **堆内存**:动态分配,使用`malloc`/`calloc`分配,`free`释放。 6. **错误与调试** - **运行时...
### C/C++函数指针教程 #### 一、函数指针简介 函数指针是C/C++编程语言中一个非常强大的特性,它允许程序将函数作为参数传递或从函数返回,从而实现高度灵活的编程模式。函数指针可以极大地提高代码的可重用性和...
通过预处理,Pro*C/C++ 将PL/SQL块转换为C或C++函数调用,然后可以使用标准的C/C++编译器进行编译和链接,生成可执行程序。这使得开发者能够利用C/C++的强大功能,同时利用PL/SQL来处理与数据库相关的任务,如查询、...
《C/C++程序设计教程》是一本面向初学者和进阶者的编程教材,旨在帮助学习者掌握C语言和C++的基础知识。课程首先介绍了计算机系统的组成,包括硬件系统(如CPU、内存、外存和输入输出设备)、软件系统(如操作系统、...
本篇将详细讲解如何在Visual Studio 2010 (VS2010)环境下,创建汇编语言编写的动态链接库(DLL),并从C/C++程序中调用这些函数。这个过程分为几个关键步骤,包括编写汇编代码、创建DLL项目、设置头文件和接口,以及...
在IT行业中,C和C++是两种非常重要的编程语言,它们在系统级编程、游戏开发、嵌入式系统以及高性能计算等领域广泛应用。标题中的“c/c++精彩实例”表明这是一份包含C/C++编程的实际案例集合,这些实例通常用于教学...
【C/C++语言课程设计】是一项常见的编程实践任务,旨在帮助学生深入理解编程语言的原理和应用。在这个项目中,作者使用了Visual C++ 6.0(简称VC6.0)作为开发环境,设计了一个结合文件加密和通信录功能的程序。 ...
C/C++中多维数组指针作为函数参数传递程序 在 C++ 中,多维数组指针作为函数参数传递是非常常见的编程技术。本文将详细介绍如何在 C/C++ 中将多维数组指针作为函数参数传递,並对相关知识点进行详细解释。 多维...
C/C++是两种常见的编程语言,它们可以用来开发Modbus通信库,以实现对Modbus协议的支持。本文将详细讲解Modbus协议、C/C++编程语言在Modbus通信中的应用,以及libmodbus这个特定的库。 首先,了解Modbus协议。...
综上所述,谭浩强的C语言教程全面覆盖了C/C++编程的基础知识,从语言的历史、语法到数据类型、控制结构、数组和函数,为初学者提供了坚实的理论和实践基础。深入学习和实践这些概念将帮助编程者掌握核心技能,为更...
### 论C/C++函数间动态内存的传递 #### 内存操作及问题相关知识点 在探讨C/C++中函数间动态内存的传递这一主题前,我们首先需要回顾一些基本的内存管理概念。 ##### (1)内存分配方式 内存分配主要有三种方式:...
异步流及 CUDA C/C++ 应用程序的可视化性能分析 最后的练习:加速和优化N体模拟器 n-body 模拟器可以预测通过引力相互作用的一组物体的个体运动。01-nbody.cu 包含一个简单而有效的 n-body 模拟器,适合用于在三维...
总结来说,C/C++语言的可变参数函数参数传递机制主要基于栈内存的使用以及一些特定的宏处理,其中C语言使用va_list宏系列,而C++则提供模板和折叠表达式来实现类似的功能。理解这些机制对于深入学习C/C++的底层细节...
### C/C++头文件概述与知识点详解 #### 1. `<assert.h>` — 断言与调试...以上就是关于C/C++中常见头文件的基本介绍和使用示例。这些头文件是C/C++编程的基础,掌握了它们可以帮助开发者更好地进行程序设计与开发。