C/C++中void的作用,C/C++的语法对函数的一些影响

来源:互联网 发布:怎么导入淘宝数据包 编辑:程序博客网 时间:2024/05/23 10:56

CPU型号:Intel(R) Core(TM) M-5Y71

系统:windows 10

IDE:Microsoft Visual C++ 6.0(下文中简称VC)


void的作用主要有以下三点:

1.作为指针的修饰符,表示无类型指针

2.作为函数的返回类型

3. 作为函数的参数,表示没有形参



1、void是C语言中32个关键字的其中一个,字面意思就是“空,没有”,修饰指针的时候表示“无类型指针”,如void *p,但是却不存在修饰变量,如void i,这是什么原因呢?

在C语言中,一个指针的大小为CPU寻址位数,一般的为32位即4个字节,因此void只是表示该指针类型为无类型(可以指向其他任何类型),因此void *p;是合法的,编译的过。

但是void i;呢?由于这是定义式声明变量的语句,因此编译器要为变量i分配具体的内存空间,而如果用void修饰,编译器就不知道要给i分配多大内存的空间,因此是错误的,过不了编译器!


2、在C语言中,对于类型的检查并没有那么严格,函数可以不写返回类型,编译时也不会警告报错,但是C++环境下,语法就相对比较严格

 测试代码1:

main(){}

 CC++警告无。warning C4508: 'main' : function should return a value; 'void' return type assumed错误无。无。

同样的一段代码,在C语言中完全没有警告和错误,但是C++就有警告,说明C++的语法上更加严格。


测试代码2:

main(){return 0;}
 CC++警告无无错误无无

这个代码,在C/C++环境都无报错,说明默认函数都是有返回类型的,而且是整型,可在测试3的代码中验证。


测试代码3:

main(){return "hello";}
 CC++警告warning C4047: 'return' : 'int ' differs in levels of indirection from 'char [6]'无错误无

error C2440: 'return' : cannot convert from 'char [6]' to 'int'
        This conversion requires a reinterpret_cast, a C-style cast or function-style cast

error C2617: 'main' : inconsistent return statement

首先可以看到,没有指明返回类型的函数默认返回类型为int。如果返回类型不匹配,C语言是警告,而C++却是错误,更加说明C++的语法更加严格


如果用void修饰返回类型时,函数就可以不用返回类型了。但是如果非要返回一个类型呢?

测试代码4:

void main(){return 0;}

 CC++警告warning C4098: 'main' : 'void' function returning a value无错误无

error C2562: 'main' : 'void' function returning a value

对于声明为void类型的函数,如果强制返回一个值,在C语言中是一个警告,但是在C++中则上升到错误的高度!


3、void可以修饰函数的形参表,但是在C语言和C++环境下还是有细微的区别

先看下函数形参表中不加void类型,是否就是表示空类型

测试代码5:

void fun(){}void main(){fun(0);}

 CC++警告无无错误无

error C2660: 'fun' : function does not take 1 parameters

这次的测试代码在C和C++中编译的结果差别很大,在C语言中是一个警告错误都没有,而在C++则是一个错误。

既然在C中函数形参表为空的参数在调用时可以加参数,1个参数可以, 那多个参数呢?

测试代码6:

#include <stdio.h>void fun(){}void main(){fun(0,1,2,3);}

经过编译,发现还是可以通过!

既然可以通过,那也就是说空形参表的函数fun()就等价于一个可变参数的函数,这跟我们设想的结果还是有很大差异的!毕竟我们原意是定义fun()函数是没有形参的!

那如果找到这几个可变参数呢?几乎是找不到的!但是它肯定存在在内存的某个角落,因此定义变量的时候最好要初始化,免得有其他脏数据!


现在在形参表中加入void修饰符

测试代码7:

void fun(void){}void main(){fun(0);}


 CC++警告warning C4087: 'fun' : declared with 'void' parameter list无错误无

error C2660: 'fun' : function does not take 1 parameters

结果也跟预想的差不多,C语言中只是温柔的警告,C++中是严重的错误!


综上所述,函数无形参时写个void是一个安全而且正确的做法!


0 0
原创粉丝点击