Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[A07]C 语言使用 int main 还是 void main #11

Open
hylerrix opened this issue Sep 19, 2017 · 0 comments
Open

[A07]C 语言使用 int main 还是 void main #11

hylerrix opened this issue Sep 19, 2017 · 0 comments

Comments

@hylerrix
Copy link
Owner

hylerrix commented Sep 19, 2017

从大一入学刚接触C到现在已满7个月了,虽然刚开始就知道 int main才是标准的写法,但一直没有深刻理解为什么不能用 void main而必须使用 int main

刚好最近有非计算机相关专业学C的同学问我 int mainmainvoid main 有什么区别,便觉得是时候好好整理一番了,于是有了此博客。
 

先简而言之

  1. void 和 int 表明声明不同的主函数返回值,不声明则默认返回值为int整型。
  2. int main可移植性强。
  3. C语言从来没声明过void main,只声明过main()
  4. 抛弃一切用void main编写C程序的习惯!
     

稍微深入

main 函数,又称主函数,作为绝大大部分 C 程序唯一的入口(比如 windows
编程中可以编写一个其他 windows 程序都可以使用的动态链接库(dll)模块,由于 DLL 模块不是独立的程序,因此不需要 main 函数。再比如,用于专业环境的程序-----如机器人中的控制芯片--可能不需要 main 函数),是要求有返回值的,该返回值返回给操作系统来表明改程序的执行状况。

返回 0 代表程序正常执行成功,返回非 0 值代表程序异常结束,因此返回值需要是int整型,于是有了 int main()的规范。如果使用 void main,既声明主函数没有返回值的话,程序随能编译、运行成功,却不利于操作系统判断其状态,这对于由很多 C 程序构成的大型项目来说是可能会是致命的。

尤其从 c99 标准(1999年制定的官方C语言标准第二版)开始必须使用 int main,如果没加 return 0; 语句 C99 要求编译器自动添加(自己写上是个好习惯)。只声明 main 的话系统默认为 int mainvoid main 无论何时都不应该使用因为主函数必须有返回值表明程序运行状态(在很少的代码中最少不使用void main是一个良好的变成习惯)。

学校老版教材推荐编写C程序时使用的 VC6.0 是 98 年的产品,而 C99 标准见名思义在 1999 年制定,因此 VC 不会自动添加 return 0;。Windows 下建议尝试使用 DEV C++ 或 Visual Studio 的 IDE 环境(集成开发环境)写 C 代码。
 

再深入一点

在最新的 C99 标准中,只有以下两种定义方式是正确的:

int main(void){}
//整数类型主函数(无类型)
int main(int argc,char **argv)
//整数类型主函数(整数类型 统计参数个数,字符类型*数组指针至字符[])

如果没有 int main 并且不是 return 0; 的话,编译完C程序后生成了 exe 文件,在 DOS (按下 Windows 键+ r 键后输入 cmd 打开)下用执行该文件的命令时(比如是 1.exe),语句后面加上 && dir 就会发现并没有列出当前目录的列表!(&& 是按先后顺序执行两条命令的连接符,dir 命令在 DOS 下用来列出当前所在文件下的目录列表的~)

为什么没执行成功dir命令呢?正是因为写的C程序没有返回值,操作系统认为程序没有成功执行完毕,因此就不会执行 && 后面的dir命令了…

上面两种正确的定义方式一般接触 C 语言阶段用前者足以,括号里面的 void 指明主函数并不需要参数,而后者:

int main(int argc, char *argv[]);

表明 main 函数返回值为整型,带两个参数,argc为命令行参数的个数,argv为指针数组,前 argc 个指针为参数列表,最后一个指针值为NULL。具体见下方链接。

参考链接和可深入理解C的其它链接:

@hylerrix hylerrix changed the title [A07]解剖《C 语言深度解剖》 [A07]C 语言使用 int main 还是 void main Sep 20, 2017
@hylerrix hylerrix removed the training label Sep 20, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant