C标准和C++标准在main函数上是有区别的,所以我分别详细来介绍他们。

对于C语言:

C89标准的main()函数是可接受的,尽管现在建议是使用C99的标准。C99标准只定义了如下两种可接受的函数原型:

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

以上函数原型微小的变形也是可以被接受的,比如int可以被typedef定义为int的名字所代替,argv的类型也可以写成char **argv,等等。

第一种函数原型选择适用你不许要访问命令行参数的时候。

对于第二种函数原型选择,如果你喜欢的话,标识符argc和argv的名字可以改变,但是坚持使用argc/argv是一个惯例。

main()函数的返回值必须是一个int型,返回值给main()函数的调用者传递一个int类型的状态。

在C89标准下,main()函数中的return语句是必须的;然而在C99标准下,如果没有写return语句,默认(隐含的)会return 0。

对于C++语言:

可以被接受的使用方式有:

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

第一种遵循被C99中使用的惯例。

第二种适用于不需要访问命令行参数的环境,相当于C99中的int main(void)。

return必须返回一个int型数值,默认返回0(但是标准中并没有要求)。

int main()和int main(void)的区别

C程序员通常误认为下面的函数原型是不要参数的:

int foo();

事实上,这个函数是被认为需要不确定个数的参数。告诉编译器函数为不带参数的正确做法是:在括号中使用void关键字。

void main()的细节(机理):

C和C++中正常的函数调用和返回,假如你不想从一个函数中返回任何东西,你可以定义函数的返回值类型为void。例如,一个函数不带参数,无返回值的函数原型可以定义为:

void foo(void);

一个正常的误解是这样的逻辑也被应用于main函数。是的,它不可以,main函数是特殊的,你应该遵循标准并定义函数的返回值为int。但是在一些特殊的系统中是可以的。如果你不确定你正在使用的是否是特殊系统之一的话,那答案就是“不是”。如果是特殊系统的话,你应该已经知道了。

提醒你如果你在论坛上发带有"void main"的代码,会有人来告诉你要你纠正它。如果你回复说“我的老师说这样是可以的”也无用。老师们有错误的习惯。安全起见,在论坛上只贴标准的代码,然后你会发现人们集中在回答你的问题,而不是在告诉你函数原型的事情上浪费时间。

但是int main(int argc, char *argv[], char *envp[])是怎么回事呢?

作为对标准的扩展,在一些系统中一个附加的main函数参数可以被用来获得并访问环境变量。这并不保证在所有的编译器上都能正常工作,如果你想让你的代码可移植,那么请慎重使用它。

  1. #include <stdio.h>
  2. void fnc(void) {
  3. puts("void parameter list");
  4. }
  5. void fnc_1(unsigned short n) {
  6. printf("%hx\n", n);
  7. }
  8. void fnc_2(unsigned int n0, unsigned int n1) {
  9. printf("%x %x\n", n0, n1);
  10. }
  11. int main(void) {
  12. void (* ptr_fnc)(); //可变参数列表
  13. ptr_fnc = fnc;
  14. ptr_fnc();
  15. ptr_fnc = fnc_1;
  16. ptr_fnc(0x1);
  17. ptr_fnc = fnc_2;
  18. ptr_fnc(0x2, 0x3);
  19. return 0;
  20. }

C语言中函数的参数列表为空和void的区别相关推荐

  1. c语言理解参数,c语言中对可变参数列表的简单理解

    函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...

  2. C语言_函数可变参数列表

    函数可变参数列表的应用和原理 在网上看到各位前辈关于这部分的介绍有些是过于简洁,有些则是过于晦涩,有的代码拿出来甚至在编译器上跑不过去,所以在这里讲一下自己对于可变参数的认识,若有不正确的地方,欢迎各 ...

  3. C语言中函数可变参数解析

    大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...

  4. c语言中的函数可变参数列表相关的三个宏

    在stdarg.h头文件中声明了一个类型va_list和3个与函数可变参数列表有关的宏:va_start.va_arg.va_end. #include<stdarg.h> //包含宏相关 ...

  5. c语言中函数参数为空是什么意思,C语言函数参数为空和void

    C语言中函数参数的为空和用void标注他们的效果一样吗? #include 2 //int add(); 3 int add(void); 4 int main(void) 5 { 6     int ...

  6. c语言va_start函数,va_start和va_end,以及c语言中的可变参数原理

    FROM:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_start和va_end的使用及原理. 在 ...

  7. R语言可视化绘制及PDF使用字体参数列表:查看字体列表、可视化绘制图像中的字体参数列表、字体示例并写入pdf

    R语言可视化绘制及PDF使用字体参数列表:查看字体列表.可视化绘制图像中的字体参数列表.字体示例并写入pdf 目录 R语言可视化绘制及PDF使用字体参数列表:查看字体列表.可视化绘制图像中的字体参数列 ...

  8. c语言中函数参数处理顺序以及默认参数原则

    c语言中函数参数处理顺序 下面我们来看2个案例,分析下c语言中函数参数处理顺序. 第一个: #include "stdio.h"void fn(int a,int b,int c) ...

  9. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

最新文章

  1. Luna的大学读书史(1,Intro)
  2. Stream流中的常用方法_skip
  3. 斐波那契博弈(证明+结论)
  4. html5支持哪媒体,html5 支持哪些媒体元素
  5. 安装ie9提示未能完成安装_Windows 7下安装IE 11失败,提示:Internet Explorer未能完成安装...
  6. 把复杂变简单,能产生颠覆的力量
  7. 【三维路径规划】基于matlab GUI蚁群算法无人机三维路径规划【含Matlab源码 254期】
  8. 网络通信原理_互联网通信协议
  9. 华为android界面强刷救砖教程,华为手机救砖教程 华为手机开不了机变砖自救
  10. c4d r21中文语言包安装失败怎么办,Windows10系统下语言包安装失败的解决方案
  11. 客户端到服务器端的通信过程及 原理图很好
  12. 计算机符号mi,在线特殊符号大全
  13. 几行代码教你爬取LOL皮肤图片
  14. 数字信号处理中,系统函数零极点图的绘制
  15. 大文件上传NeatUpload简单用法 (转)
  16. 《极简算法史》读书札记
  17. 如何通过“云之讯”平台,完成短信的发送
  18. Buffalo G450h 变砖刷机
  19. Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to da tabase unique name.
  20. 接地电阻测试仪常用的5种接线方法介绍

热门文章

  1. 一年以来我最好的创意
  2. ConcurrentHashMap源码解析(2)
  3. python字符串面试题:找出一个字符串中第一个字母和最后一个字符是第一次重复,中间没有重复且最长的子串...
  4. [School Life - Study] 有哪些每天坚持效果显著的高中学习习惯?
  5. stylus-loader (copy)
  6. 阿里云 yum无法正常使用的解决办法 (转)
  7. 孙庆新:做产品,感觉从何而来
  8. 二维码 | 如何实现一码多用
  9. 神经网络与机器学习 笔记—小规模和大规模学习问题
  10. POJ3762 时间段用k次