C语言中函数的参数列表为空和void的区别
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函数参数可以被用来获得并访问环境变量。这并不保证在所有的编译器上都能正常工作,如果你想让你的代码可移植,那么请慎重使用它。
- #include <stdio.h>
- void fnc(void) {
- puts("void parameter list");
- }
- void fnc_1(unsigned short n) {
- printf("%hx\n", n);
- }
- void fnc_2(unsigned int n0, unsigned int n1) {
- printf("%x %x\n", n0, n1);
- }
- int main(void) {
- void (* ptr_fnc)(); //可变参数列表
- ptr_fnc = fnc;
- ptr_fnc();
- ptr_fnc = fnc_1;
- ptr_fnc(0x1);
- ptr_fnc = fnc_2;
- ptr_fnc(0x2, 0x3);
- return 0;
- }
C语言中函数的参数列表为空和void的区别相关推荐
- c语言理解参数,c语言中对可变参数列表的简单理解
函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...
- C语言_函数可变参数列表
函数可变参数列表的应用和原理 在网上看到各位前辈关于这部分的介绍有些是过于简洁,有些则是过于晦涩,有的代码拿出来甚至在编译器上跑不过去,所以在这里讲一下自己对于可变参数的认识,若有不正确的地方,欢迎各 ...
- C语言中函数可变参数解析
大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...
- c语言中的函数可变参数列表相关的三个宏
在stdarg.h头文件中声明了一个类型va_list和3个与函数可变参数列表有关的宏:va_start.va_arg.va_end. #include<stdarg.h> //包含宏相关 ...
- c语言中函数参数为空是什么意思,C语言函数参数为空和void
C语言中函数参数的为空和用void标注他们的效果一样吗? #include 2 //int add(); 3 int add(void); 4 int main(void) 5 { 6 int ...
- c语言va_start函数,va_start和va_end,以及c语言中的可变参数原理
FROM:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_start和va_end的使用及原理. 在 ...
- R语言可视化绘制及PDF使用字体参数列表:查看字体列表、可视化绘制图像中的字体参数列表、字体示例并写入pdf
R语言可视化绘制及PDF使用字体参数列表:查看字体列表.可视化绘制图像中的字体参数列表.字体示例并写入pdf 目录 R语言可视化绘制及PDF使用字体参数列表:查看字体列表.可视化绘制图像中的字体参数列 ...
- c语言中函数参数处理顺序以及默认参数原则
c语言中函数参数处理顺序 下面我们来看2个案例,分析下c语言中函数参数处理顺序. 第一个: #include "stdio.h"void fn(int a,int b,int c) ...
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...
最新文章
- Luna的大学读书史(1,Intro)
- Stream流中的常用方法_skip
- 斐波那契博弈(证明+结论)
- html5支持哪媒体,html5 支持哪些媒体元素
- 安装ie9提示未能完成安装_Windows 7下安装IE 11失败,提示:Internet Explorer未能完成安装...
- 把复杂变简单,能产生颠覆的力量
- 【三维路径规划】基于matlab GUI蚁群算法无人机三维路径规划【含Matlab源码 254期】
- 网络通信原理_互联网通信协议
- 华为android界面强刷救砖教程,华为手机救砖教程 华为手机开不了机变砖自救
- c4d r21中文语言包安装失败怎么办,Windows10系统下语言包安装失败的解决方案
- 客户端到服务器端的通信过程及 原理图很好
- 计算机符号mi,在线特殊符号大全
- 几行代码教你爬取LOL皮肤图片
- 数字信号处理中,系统函数零极点图的绘制
- 大文件上传NeatUpload简单用法 (转)
- 《极简算法史》读书札记
- 如何通过“云之讯”平台,完成短信的发送
- Buffalo G450h 变砖刷机
- Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to da tabase unique name.
- 接地电阻测试仪常用的5种接线方法介绍